Như chúng tôi đã đề cập C# là ngôn ngữ lập trình hướng đối tượng do đó chúng ta phải nắm vững thế nào là class, objects, interface và inheritance. Nếu trước đây bạn đã lập trình C++ hay Java thì bạn nên nắm vững nền của lập trình hướng đối tượng. (OOP)
Nếu bạn chưa học qua lập trình hướng đối tượng thì cuốn sách này sẽ giúp bạn học nó, phụ lục A có cung cấp cho bạn những hướng dẫn trong lập trình OOP.
Nếu bạn là người đã có kinh nghiệm trong VB 6, C++, hoặc Java bạn nên lưu ý sự so sánh sự khác nhau của chúng tôi về C# và C++, Java, VB 6 chúng ta sẽ có cái nhìn rõ hơn trong việc học C#.
Chương trình đầu tiên !
Hướng dẫn lập trình Visual C# tạo form bảng tính Calculator phần 1
Hướng dẫn lập trình Visual C# tạo form bảng tính Calculator phần2
Chúng ta sẽ bắt đầu theo cách truyền thống là tạo một chương trình viết bằng C# rồi cho biên dịch và chạy thử nghiệm. Việc phân tích chương trình con này sẽ dẫn dắt bạn vào những chức năng chủ chốt của ngôn ngữ C#.
Bạn có thể biên dịch chương trình này bằng cách khỏ vào chương trình soạn thảo văn bản đơn giản, Notepad chẳng hạn, rồi cho cất trữ dưới dạng tập tin với tên mở rộng là .cs (tắt chữ C sharp), rồi cho chạy trình biên dịch C# command_line (scs.exe) ví dụ tập tin First.cs :
using System;
namespace Wrox.ProCSharp.Basics
{
class MyFirstCSharpClass
{
static void Main()
{
Console.WriteLine("This isn't at all like Java!");
Console.ReadLine();
return;
}
}
}
namespace Wrox.ProCSharp.Basics
{
class MyFirstCSharpClass
{
static void Main()
{
Console.WriteLine("This isn't at all like Java!");
Console.ReadLine();
return;
}
}
}
csc First.cs
Microsoft (R) Visual C# .NET Compiler version 7.00.9466
for Microsoft (R) .NET Framework version 1.0.3705
Copyright (C) Microsoft Corporation 2001. All rights reserved.
First
This isn't at all like Java!
Microsoft (R) Visual C# .NET Compiler version 7.00.9466
for Microsoft (R) .NET Framework version 1.0.3705
Copyright (C) Microsoft Corporation 2001. All rights reserved.
First
This isn't at all like Java!
Biến và Hằng
Một biến dùng để lưu trữ giá trị mang một kiểu dữ liệu nào đó.
Cú pháp C# sau đây để khai báo một biến :
[ modifier ] datatype identifer ;
Với modifier là một trong những từ khoá : public, private, protected, . . . còn datatype là kiểu dữ liệu (int , long , float. . . ) và identifier là tên biến.
Thí dụ dưới đây một biến mang tên i kiểu số nguyên int và có thể được truy cập bởi bất cứ hàm nào.
thí dụ :
public int i ;
i = 10 ;
int i = 10 ;
int x = 10; y = 20;
int x = 10;
bool y = true ; // khai báo trên đúng
int x = 10 , bool = true // khai báo trên có lỗi
int x = 10;
bool y = true ; // khai báo trên đúng
int x = 10 , bool = true // khai báo trên có lỗi
Phạm vi hoạt động của biến là vùng đoạn mã mà từ đấy biến có thể được truy xuất.
Trong một phạm vi hoạt động (scope), không thể có hai biến cùng mang một tên trùng nhau.
Thí dụ ta không thể làm như sau :
i
nt x = 20;
// một số câu lệnh ở đây
int x = 30;
// một số câu lệnh ở đây
int x = 30;
using System;
namespace Wrox.ProCSharp.Basics
{
public class ScopeTest
{
public static int Main()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
} // biến i ra khỏi phạm vi
// Chúng ta có thể khai báo thêm biến i ở đây
for (int i = 9; i >= 0; i--)
{
Console.WriteLine(i);
} // biến i ra khỏi phạm vi ở đây
return 0;
}
}
}
namespace Wrox.ProCSharp.Basics
{
public class ScopeTest
{
public static int Main()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
} // biến i ra khỏi phạm vi
// Chúng ta có thể khai báo thêm biến i ở đây
for (int i = 9; i >= 0; i--)
{
Console.WriteLine(i);
} // biến i ra khỏi phạm vi ở đây
return 0;
}
}
}
Chúng ta xem tiếp một ví dụ khác :
public static int Main()
{
int j = 20;
for (int i = 0; i < 10; i++)
{
int j = 30; // không thể thực thi - j vẫn còn trong phạm vi
Console.WriteLine(j + i);
}
return 0;
}
{
int j = 20;
for (int i = 0; i < 10; i++)
{
int j = 30; // không thể thực thi - j vẫn còn trong phạm vi
Console.WriteLine(j + i);
}
return 0;
}
Ta xem đoạn thí dụ sau :
using System;
namespace Wrox.ProCSharp.Basics
{
class ScopeTest2
{
static int j = 20;
public static void Main()
{
int j = 30;
Console.WriteLine(j);
return;
}
}
}
namespace Wrox.ProCSharp.Basics
{
class ScopeTest2
{
static int j = 20;
public static void Main()
{
int j = 30;
Console.WriteLine(j);
return;
}
}
}
HẰNG:
Một hằng (constant) là một biến nhưng trị không thể thay đổi được suốt thời gian thi hành chương trình. Đôi lúc ta cũng cần có những giá trị bao giờ cũng bất biến.
Thí dụ
const int a = 100; // giá trị này không thể bị thay đổi
Trong định nghĩa lớp mà ta sẽ xem sau, người ta thường định nghĩa những mục tin (field) được gọi là read-only variable, nghĩa là những biến chỉ được đọc mà thôi
Hằng có những đặc điểm sau :
Hằng bắt buộc phải được gán giá trị lúc khai báo.Một khi đã được khởi gán thì không thể viết đè chồng lên.
Trị của hằng phải có thể được tính toán vào lúc biên dịch, Do đó không thể gán một hằng từ một trị của một biến. Nếu muốn làm thế thì phải sử dụng đến một read-only field.
Hằng bao giờ cũng static, tuy nhiên ta không thể đưa từ khoá static vào khi khai báo hằng.
Có ba thuận lợi khi sử dụng hằng trong chương trình của bạn :
Hằng làm cho chương trình đọc dễ dàng hơn, bằng cách thay thế những con số vô cảm bởi những tên mang đầy ý nghĩa hơn.
Hằng làm cho dễ sữa chương trình hơn.
Hằng làm cho việc tránh lỗi dễ dàng hơn, nếu bạn gán một trị khác cho một hằng đâu đó trong chương trình sau khi bạn đã gán giá trị cho hằng, thì trình biên dịch sẽ thông báo sai lầm.
Dữ liệu kiểu trị và kiểu qui chiếu
C# là một ngôn ngữ được kiểm soát chặt chẻ về mặt kiểu dữ liệu, ngoài ra C# còn chia các kiểu dữ liệu thành hai loại khác nhau: kiểu trị (value type) và kiểu qui chiếu (reference type). Nghĩa là trên một chương trình C# dữ liệu được lưu trữ một hoặc hai nơi tuỳ theo đặc thù của kiểu dữ liệu.
Chỗ thứ nhất là stack một vùng ký ức dành lưu trữ dữ liệu chiều dài cố định, chẳng hạn int chiếm dụng 4 bytes . Mỗi chương trình khi đang thi hành đều được cấp phát riêng một stack riêng biệt mà các chương trình khác không được mó tới. Khi một hàm được gọi hàm thi hành thì tất cả các biến cục bộ của hàm được ấn vào stack và khi hàm hoàn thành công tác thì những biến cục bộ của hàm đều bị tống ra. Đây là cách thu hồi khi hàm hết hoạt động.
Chỗ thứ hai là heap, một vùng ký ức dùng lưu trữ dữ liệu có bề dày thay đổi và khá đồ sộ, string chẳng hạn, hoặc dữ liệu có một cuộc sống dài hơn phương thức của một đối tượng chẳng hạn, Thí dụ khi phương thức thể hiện (instantiate) một đối tượng , đối tượng đuợc lưu trữ trên heap, và nó không bị tống ra khi hàm hoàn thành giống như stack, mà ở nguyên tại chỗ và có thể trao cho các phương thức khác thông qua một qui chiếu. Trên C# heap này được gọi là managed heap, khôn lanh vì heap này có một bộ phận gọi là garbage collector (GC,dịch vụ hốt rác ) chuyên lo thu hồi ký ức lâu ngày không dùng đến (nghĩa là không quy chiếu đến).
C# cũng hỗ trợ kiểu con trỏ (pointer type) giống như C++ nhưng ít khi dùng đến và chỉ dùng khi làm việc với đoạn mã unmanaged. Đoạn mã unmanaged là đoạn mã đuợc tạo ra ngoài sàn diễn .NET, chẳng hạn những đối tượng COM.
Kiểu giá trị được định nghĩa trước (Predefined Value Types)
Kiểu dữ liệu bẩm sinh (The built-in value types) trình bày ban đầu như integer và floating-point numbers, character, và Boolean types.
Các kiểu Integer:
C# hỗ trợ 8 kiểu dữ liệu số nguyên sau:
Name
CTS Type
Description
Range (min:max)
sbyte System.SByte
8-bit signed integer
-128:127 (-27:27-1)
short System.Int16
16-bit signed integer
-32,768:32,767 (-215:215-1)
int System.Int32
32-bit signed integer
-2,147,483,648:2,147,483,647 (-231:231-1)
long System.Int64
64-bit signed integer
-9,223,372,036,854,775,808: 9,223,372,036,854,775,807 (-263:263-1)
byte System.Byte
8-bit signed integer
0:255 (0:28-1)
ushort System.UInt16 16-bit signed integer
0:65,535 (0:216-1)
uint System.UInt32 32-bit signed integer
0:4,294,967,295 (0:232-1)
ulong System.UInt64 64-bit signed integer
0:18,446,744,073,709,551,615(0:264-1)
CTS Type
Description
Range (min:max)
sbyte System.SByte
8-bit signed integer
-128:127 (-27:27-1)
short System.Int16
16-bit signed integer
-32,768:32,767 (-215:215-1)
int System.Int32
32-bit signed integer
-2,147,483,648:2,147,483,647 (-231:231-1)
long System.Int64
64-bit signed integer
-9,223,372,036,854,775,808: 9,223,372,036,854,775,807 (-263:263-1)
byte System.Byte
8-bit signed integer
0:255 (0:28-1)
ushort System.UInt16 16-bit signed integer
0:65,535 (0:216-1)
uint System.UInt32 32-bit signed integer
0:4,294,967,295 (0:232-1)
ulong System.UInt64 64-bit signed integer
0:18,446,744,073,709,551,615(0:264-1)
Thí dụ :
long x = 0x12ab;// ghi theo hexa
uint ui = 1234U;
long l = 1234L;
ulong ul = 1234UL;
uint ui = 1234U;
long l = 1234L;
ulong ul = 1234UL;
Name CTS Type Description Significant Figures
Range (approximate)
Float System.Single 32-bit single-precision floating- point
7 ±1.5 × 10-45 to ±3.4 × 1038
Double System.Double 64-bit double-precision floating- point
15/16 ±5.0 × 10-324 to ±1.7 × 10308
Range (approximate)
Float System.Single 32-bit single-precision floating- point
7 ±1.5 × 10-45 to ±3.4 × 1038
Double System.Double 64-bit double-precision floating- point
15/16 ±5.0 × 10-324 to ±1.7 × 10308
Thí dụ:
float f = 12.3F;
Kiểu dữ liệu số thập phân (Decimal Type):
Name CTS Type Description Significant Figures
Range (approximate)
decimal System.Decimal 128-bit high precision decimal notation
28 ±1.0 × 10-28 to ±7.9 × 1028
Thí dụ :
decimal d = 12.30M ; //có thể viết decimal d = 12.30m;
Kiểu Boolean :
Name CTS Type Value
Bool System.Boolean
true or false
Kiểu Character Type:
Name CTS Type Value
char System.Char
Represents a single 16-bit (Unicode) character
Kiểu tham khảo tiền định nghĩa:
C# hỗ trợ hai kiểu dữ liệu được định nghĩa trước:
Name
CTS Type
Description
object
System.Object
The root type, from which all other types in the CTS derive (including value types)
string
System.String
Unicode character string
Các ký tự escape thông dụng:
Escape Sequence
Character
\'
Single quote
\"
Double quote
\\
Backslash
\0
Null
\a
Alert
\b
Backspace
\f
Form feed
\n
Newline
\r
Carriage return
\t
Tab character
\v
Vertical tab
Character
\'
Single quote
\"
Double quote
\\
Backslash
\0
Null
\a
Alert
\b
Backspace
\f
Form feed
\n
Newline
\r
Carriage return
\t
Tab character
\v
Vertical tab
Các kiểu chuỗi :
Đối tượng kiểu string thường chứa một chuỗi ký tự.Khi khai báo một biến chuỗi sử dụng từ khoá string giống như sau:
string myString;
Thường thì phải khởi gán một biến chuỗi sử dụng đến một kiểu string :
string myString = "Xin chao" ;
string str1 = "Hello ";
string str2 = "World";
string str3 = str1 + str2; //
Thí dụ sau:
using System;
class StringExample
{
public static int Main()
{
string s1 = "a string";
string s2 = s1;
Console.WriteLine("s1 is " + s1);
Console.WriteLine("s2 is " + s2);
s1 = "another string";
Console.WriteLine("s1 is now " + s1);
Console.WriteLine("s2 is now " + s2);
return 0;
}
}
class StringExample
{
public static int Main()
{
string s1 = "a string";
string s2 = s1;
Console.WriteLine("s1 is " + s1);
Console.WriteLine("s2 is " + s2);
s1 = "another string";
Console.WriteLine("s1 is now " + s1);
Console.WriteLine("s2 is now " + s2);
return 0;
}
}
s1 is a string
s2 is a string
s1 is now another string
s2 is now a string
Chuổi được khai báo là một đường dẫn:
string filepath = "C:\\ProCSharp\\First.cs";