Lớp là một cấu trỳc dữ liệu nhưng bao gồm dữ liệu và cỏc
phương thức thao tỏc trờn dữ liệu đú. Lớp định nghĩa kiểu dữ liệu
mới, dựng để tạo đối tượng thuộc kiểu lớp đú.
Khi định nghĩa một lớp, bạn chỉ ra thuộc tớnh (fields) của lớp được thể hiện bằng biến gọi là biến thành viờn (member variable) và
hành vi được thể hiện bởi mó lệnh trong phương thức (method), thuộc
tớnh (property), sự kiện (event), chỉ mục (indexer) và tham chiếu phương thức (delegate). Trong hầu hết cỏc lớp, cỏc biến thành viờn
được truy cập bởi cỏc phương thức của lớp đú. Vỡ vậy, chớnh cỏc phương thức quyết định dữ liệu của lớp cú thể dựng như thế nào.
Dạng đầy đủ của một định nghĩa lớp như sau:
[public/internal]
Lớp được truy xuất chung cho
cỏc gúi khỏc, nếu khụng cú
public, mặc định là internal, chỉ được truy xuất trong nội bộ một
assembly.
[static]
Lớp tĩnh chỉ chứa thành viờn tĩnh. Khụng thể khởi tạo đối tượng của lớp tĩnh bởi toỏn tử
new. Lớp tĩnh là lớp hằng
[abstract] Lớp trừu tượng, khụng thể khởi
tạo đối tượng
[sealed] Lớp hằng khụng cú lớp con
[partial] Phõn tỏch định nghĩa lớp vào
nhiều tập tin
class TờnLớp Tờn lớp
[: TờnLớpCha, GiaoTiếp]
Kế thừa một lớp cha (base class) hay cài đặt cỏc giao tiếp
(interfaces)
{
// Khai bỏo hằng (constant)
// Khai bỏo biến thành viờn (field)
// Khai bỏo phương thức (method) // Khai bỏo thuộc tớnh (property)
// Khai bỏo sự kiện (event)
// Khai bỏo chỉ mục (indexer)
// Khai bỏo tham chiếu phương
thức (delegate)
}
Ngoài ra lớp cú thể chứa định nghĩa lớp khỏc, giao tiếp
(interface) và cấu trỳc (struct).
Phạm vi nhỡn thấy của kiểu (Type visibility): Cỏc kiểu như lớp
(class), giao tiếp (interface), cấu trỳc (struct), danh sỏch liệt kờ (enumeration), và tham chiếu phương thức (delegate), cú thể cú điều
khiển truy xuất public hay internal. Trong C# internal là tựy chọn mặc định cho cỏc kiểu, nếu bạn khụng sử dụng từ khúa public
// Lớp này cú thể dựng cho bất kỳ assembly nào public class MyClass{}
//Những lớp này chỉ dựng trong cựng một assembly
internal class MyHelperClass{}
class FinalHelperClass{} // Mặc định là internal trong C#.
Vớ dụ: Tạo một lớp cỏc đối tượng nhõn viờn như sau:
class NhanVien {
string HoTen; int NamSinh;
float HeSoLuong;
public static int LuongCB; }
Theo nguyờn tắc của tớnh đúng gúi, cỏc biến thành viờn nờn cú
điều khiển truy xuất là private (điều khiển mặc định). Khi đú chỉ cú phương thức thành viờn của lớp truy cập được giỏ trị của biến.
3.1.2 Tạo đối tượng
Để cú được cỏc đối tượng của một lớp phải qua hai giai đoạn:
Khai bỏo biến kiểu tham chiếu để trỏ đến đối tượng
TờnLớp TờnĐốiTượng;
Vớ dụ : NhanVien A;
Khai bỏo biến A cú kiểu lớp NhanVien, thực ra khụng cấp phỏt
bộ nhớ đủ chứa đối tượng kiểu lớp NhanVien, mà chỉ tạo ra tham
chiếu để trỏ đến đối tượng. Sau cõu lệnh này, biến A xuất hiện trờn bộ nhớ chứa giỏ trị null chỉ ra rằng nú chưa trỏ đến một đối tượng
thực tế nào.
Sau đú, để thực sự cấp phỏt bộ nhớ để tạo ra một đối tượng và
gỏn địa chỉ của đối tượng cho biến này, dựng toỏn tử new
TờnĐốiTượng = new TờnLớp();
Thật ra cỳ phỏp đỳng như sau, tuy nhiờn ta sẽ tỡm hiểu về phương thức khởi tạo sau:
TờnĐốiTượng = new PhươngThứcKhởiTạo
Vớ dụ:
A = new NhanVien();
Cú thể kết hợp cả hai bước trờn vào một cõu lệnh: TờnLớp TờnĐốiTượng = new TờnLớp();
Vớ dụ:
NhanVien A = new NhanVien();
Kiểu nặc danh (Anonymous type): C# 3.0 cho phộp tạo đối tượng thuộc lớp mà khụng cần phải định nghĩa lớp trước đú gọi là kiểu nặc danh (anonymous type).
Vớ dụ: Tạo đối tượng học viờn của một lớp cú cỏc thuộc tớnh mó học viờn, họ tờn, năm sinh
var HocVien = new {
mahv = 01,
hoten = "Nguyen Van A", namsinh = 1990
};
Khi biờn dịch, C# sẽ tạo ra một lớp cú 3 thuộc tớnh như trờn.
Ngoài ra, nếu cú 2 khai bỏo tạo đối tượng của cựng một lớp, trỡnh biờn dịch C# sẽ tạo một lớp cho 2 khai bỏo tạo đối tượng như vậy.
3.1.3. Truy xuất thành viờn của lớp
Cỏc thành viờn (members) của một lớp cú thể là thành viờn tĩnh
(static member) hay thành viờn đối tượng (instance member). Núi
chung, thành viờn đối tượng thuộc về đối tượng, và thành viờn tĩnh
thuộc về lớp.
Khi một biến, phương thức, thuộc tớnh, chỉ mục, sự kiện, phộp toỏn, phương thức khởi tạo, phương thức hủy là thành viờn tĩnh, nú được khai bỏo với từ khúa static.
Thành viờn tĩnh khụng hoạt động trờn một đối tượng cụ thể.
Một thành viờn tĩnh chia sẻ chung cho mọi đối tượng thuộc lớp, và
được truy cập thụng qua tờn lớp chứa thành viờn.
Cỏc thành viờn đối tượng hoạt động trờn một đối tượng của lớp và được truy cập thụng qua tờn đối tượng.
Chỳng ta xột hai thành viờn thụng dụng của lớp là biến và
phương thức.
3.1.3.1. Truy xuất biến
Ngoài biến thành viờn của lớp gồm biến đối tượng và biến tĩnh,
cũn cú biến cục bộ được khai bỏo bờn trong phương thức.
Biến đối tượng (Instance variable): chỉ thuộc tớnh đối tượng, khi truy xuất phải khởi tạo đối tượng. Biến đối tượng được truy cập thụng qua tờn đối tượng.
Khai bỏo biến đối tượng: Kiểu BiếnĐốiTượng;
Truy cập biến đối tượng: TờnĐốiTượng.BiếnĐốiTượng
Vớ dụ:
NhanVien nv = new NhanVien(); System.Console.WriteLine(nv.hoTen);
Biến tĩnh (Static variable): về bản chất là biến toàn cục, là biến
tĩnh được tạo lập một lần cựng với lớp, dựng chung hay chia sẻ cho mọi đối tượng thuộc lớp, khi truy xuất khụng cần khởi tạo đối tượng,
để trao đổi thụng tin của cỏc đối tượng cựng lớp. Biến tĩnh được truy
cập thụng qua tờn lớp.
Khai bỏo biến tĩnh: static Kiểu BiếnTĩnh; Truy cập biến tĩnh: TờnLớp.BiếnTĩnh
Vớ dụ:
Biến cục bộ (Local variable): Được khai bỏo và tồn tại trong phạm vi phương thức. Biến cục bộ bắt buộc phải khởi tạo giỏ trị trước khi sử dụng.
Vớ dụ: Sử dụng biến tĩnh để đếm số đối tượng
using System; public class Bong {
private static int soBong = 0; public Bong()
{
soBong++; }
public static void SoBong() {
Console.WriteLine("{0} So bong bong ", soBong); }
}
public class Test {
static void Main() {
Bong.SoBong();
Bong bong1 = new Bong(); Bong.SoBong();
} }
3.1.3.2. Lời gọi phương thức (Method caller)
Phương thức cú thể là phương thức đối tượng hay phương thức
tĩnh. Để gọi phương thức, bạn gọi tờn phương thức và truyền vào danh
sỏch tham đối thật sự (actual parameters) tương ứng với số lượng, kiểu
và thứ tự cỏc tham đối trong danh sỏch tham đối hỡnh thức (formal
parameters). Khỏc nhau giữa lời gọi phương thức đối tượng và phương
thức tĩnh, đú là phương thức đối tượng được gọi thụng qua tờn đối tượng, cũn phương thức tĩnh được gọi thụng qua tờn lớp.
Phương thức đối tượng (Instance method): Thuộc về đối tượng
và hoạt động trờn một đối tượng cụ thể. Gọi phương thức đối tượng
như biến đối tượng.
TờnĐốiTượng.PhươngThứcĐốiTượng(DanhSỏchThamĐối) Phương thức tĩnh (Static method): Dựng chung cho mọi đối tượng thuộc lớp, khi truy xuất khụng cần khởi tạo đối tượng. Khai
bỏo phương thức tĩnh bổ sung từ khoỏ static. Gọi phương thức tĩnh: TờnLớp.PhươngThứcTĩnh(DanhSỏchThamĐối) Vớ dụ: using System; class NhanVien {
private string HoTen; //Biến đối tượng
private int NamSinh; private float HeSoLuong;
public static int LuongCB; //Biến tĩnh
public float Luong() //Phương thức đối tượng
{
float L = LuongCB * HeSoLuong; //Biến cục bộ
return L; }
}
class Test {
public static void Main(string args[]) {
NhanVien.LuongCB = 290; NhanVien A = new NhanVien(); Console.WriteLine(A.Luong()) ; }
}
Cỏc hằng, phương thức chuẩn toỏn học của lớp Math trong namespace System là hằng, phương thức tĩnh nờn khi gọi khụng cần
Hằng, Phương thức í nghĩa Kiểu giỏ trị trả về Math.E Số E Số thực Math.PI Số Pi Số thực Math.Abs(x) Trị tuyệt đối của số x x cú thể là số nguyờn hay thực Cựng kiểu với x Math.Tan(x) Tan x Số thực Math.Cos(x) Cos x x tớnh bằng radian Số thực Math.Sin(x) Sin x Số thực Math.Exp(x) ex Số thực Math.Log(b, a) Logab Số thực Math.Round(x, n) Làm trũn số nguyờn với n số lẻ Số nguyờn Math.Pow(x, y) Cho xy với x,y là số thực Số thực
Math.Sqrt(x) Khai căn của số x Số thực
Vớ dụ:double s = Math.pow(r,2) * Math.PI;
3.2. PHƯƠNG THỨC
3.2.1. Định nghĩa phương thức (Method definition)
Dạng tổng quỏt của định nghĩa phương thức như sau:
[ĐiềuKhiểnTruyXuất] Phạm vi truy cập phương thức
[static] phương thức tĩnh
[abstract] phương thức trừu tượng
[sealed] phương thức hằng [Kiểu] TờnPhươngThức(DanhSỏchThamĐối) { //Thõn phương thức }
Kiểu (Data type): Kiểu dữ liệu do phương thức trả về, cú thể là
kiểu bất kỳ. Nếu phương thức khụng trả về giỏ trị nào, kiểu trả về của
nú phải là void.
Cỏc phương thức cú kiểu dữ liệu trả về khụng phải là void, sẽ trả về một giỏ trị cho phương thức sử dụng cõu lệnh return như sau:
return BiểuThức;
Giỏ trị của biểu thức được tớnh và trả về cho phương thức.
Danh sỏch tham đối (Parameter list): Danh sỏch tham đối truyền cho phương thức, phõn cỏch bởi dấu phẩy, nằm trong hai dấu ( ) ngay
sau tờn phương thức. Nếu khụng cú tham đối vẫn phải cú ( ). Mỗi tham đối phải khai bỏo kiểu, cú thể là kiểu bất kỳ, cú dạng:
Kiểu ThamĐối, Kiểu ThamĐối2 ...
C# cho phộp sử dụng từ khúa params để khai bỏo tham đối cuối cựng trong danh sỏch tham đối của phương thức là một mảng, do đú một số lượng cỏc tham đối thực sự cú thể truyền vào khi gọi phương thức.
Vớ dụ: Khai bỏo phương thức truyền vào mảng số nguyờn với từ
khúa params
public void methodCaller (params int[] a);
Và phương thức cú thể được gọi với danh sỏch cỏc số nguyờn bất kỳ
methodCaller (1);
methodCaller (1, 2, 3, 4);
int[] explicitArray = new int[5]{1,2,3,4,5}; methodCaller(explicitArray);
Bờn trong phương thức, cỏc tham đối cú thể được truy cập
thụng qua mảng a đó được định nghĩa.
Tham đối đặt tờn (Named argument): C# 4.0 giới thiệu tham đối
đặt tờn (named argument) cho phộp bạn khụng phải nhớ thứ tự tham đối trong danh sỏch tham đối thực sự của lời gọi phương thức. Cỏc
tham đối thực sự truyền vào phương thức cú thể chỉ rừ bởi
tờn của tham đối hỡnh thức. Tham đối đặt tờn cũng làm cho chương
trỡnh dễ đọc hơn bởi vỡ nú chỉ rừ ý nghĩa của tham đối thực sự. Tham đối đặt tờn cú thể sử dụng cho phương thức, chỉ mục, tham chiếu phương thức.
Vớ dụ:Phương thức tớnh diện tớch hỡnh chữ nhật
class HCN {
static int DienTich(int rong, int dai) {
return dai * rong; }
}
class Test {
//Lời gọi phương thức
HCN.DienTich(2, 4);
//Nếu khụng nhớ trật tự cỏc tham đối nhưng nhớ tờn tham đối hỡnh thức
//C# 4.0 cho phộp gọi phương thức
HCN.DienTich(dai: 4, rong: 2);
//Một tham đối đặt tờn cú thể theo sau một tham đối khụng đặt tờn HCN.DienTich(2, dai: 4);
//Nhưng tham đối khụng đặt tờn khụng thể theo sau tham đối đặt tờn HCN.DienTich(dai: 4, 2);
}
Tham đối tựy chọn (Optional argument): C# 4.0 cho phộp
phương thức, chỉ mục hay tham chiếu phương thức cú thể chỉ rừ cỏc
tham đối là bắt buộc hay tựy chọn. Bất kỳ lời gọi phương thức phải
truyền cỏc tham đối bắt buộc nhưng cú thể bỏ qua cỏc tham đối
tựy chọn.
Mỗi tham đối tựy chọn cú một giỏ trị mặc định, nếu bỏ qua tham đối tựy chọn, tham đối sẽ cú giỏ trị mặc định. Một giỏ trị mặc
định phải là biểu thức hằng hay kiểu giỏ trị. Cỏc tham đối tựy chọn được định nghĩa cuối của danh sỏch tham đối, sau cỏc tham đối bắt
buộc. Nếu lời gọi phương thức truyền tham đối cho bất kỳ tham đối
tựy chọn, phải truyền tham đối cho bất kỳ tham đối tựy chọn đứng trước trong danh sỏch tham đối.
Vớ dụ: Phương thức đối tượng MyMethod định nghĩa một tham
đối bắt buộc và hai tham đối tựy chọn.
class MyClass {
public void MyMethod(int r, string o1 = "default string", int o2 = 10) {
Console.WriteLine("{0}: {1} và {2}.", r, o1, o2); }
static void Main(string[] args) {
MyClass obj = new MyClass(); obj.MyMethod(1, "One", 1); obj.MyMethod(2, "Two"); obj.MyMethod(3);
//Lỗi biờn dịch do truyền tham đối tựy chọn thứ ba //nhưng khụng truyền tham đối tựy chọn thứ hai
//obj.MyMethod(3, ,4); //obj.MyMethod(3, 4);
//Nhưng nếu bạn biết tờn tham đối thứ ba, cú thể sử dụng tham đối đặt tờn
obj.MyMethod(3, o2: 4);
//Biờn dịch lỗi do khụng truyền tham đối yờu cầu thứ nhất
//obj.MyMethod("One", 1); //obj.MyMethod();
} }
Cải tiến hơn giao diện thành phần COM (More COM interface):
Cỏc tham đối đặt tờn và tựy chọn cựng với cỏc cải tiến khỏc của C# 3.0, 4.0 đó cải tiến đỏng kể tương tỏc với giao diện thành phần COM.
Chẳng hạn, phương thức AutoFormat trong dịch vụ Excel Interop cú 7 tham đối, tất cả đều là tựy chọn. Trong C# 3.0 và cỏc phiờn bản trước, cỏc tham đối của phương thức này đều là tham đối
bắt buộc.
var excelApp = new Microsoft.Office.Interop.Excel.Application(); excelApp.Workbooks.Add();
excelApp.Visible = true; var myFormat =
Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFor matAccounting1;
excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing);
Tuy nhiờn, với C# 4.0, bạn cú thể đơn giản lời gọi phương thức
AutoFormat bằng cỏch sử dụng tham đối đặt tờn và tựy chọn. Tham đối đặt tờn và tựy chọn cho phộp bạn bỏ qua tham đối truyền vào
phương thức nếu khụng muốn thay đổi giỏ trị mặc định.
excelApp.Range["A1", "B4"].AutoFormat(Format: myFormat);
Phương thức mở rộng (Extension method): C# 3.0 cung cấp khả
năng định nghĩa phương thức mở rộng (extension method) cho một
kiểu tồn tại, mà khụng phải tạo kiểu kế thừa hay chỉnh sửa kiểu gốc,
tỏi biờn dịch.
Phương thức mở rộng phải là phương thức tĩnh (static method), nhưng nú được gọi như một phương thức đối tượng. Kiểu dữ liệu của tham đối đầu tiờn của phương thức là kiểu lớp cần bổ sung phương
thức. Phương thức mở rộng phải đặt trong lớp tĩnh, khụng lồng nhau
(non-nested, non-generic static class). Từ khúa this phải đặt trước tham đối đầu tiờn.
Vớ dụ: Bổ sung phương thức đếm số từ trong một chuỗi cho
namespace ExtensionMethods {
public static class MyExtensions {
public static int WordCount(this String str) {
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length; } } } using ExtensionMethods; namespace ConsoleApplication1 {
public class Test {
static void Main(string[] args) {
string s = "Hello Extension Methods"; int i = s.WordCount(); Console.WriteLine(i); } } } 3.2.2. Phạm vi truy xuất thành phần của lớp
Cỏc điều khiển truy xuất (Access modifier) cú thể là:
public: Chỉ ra rằng thành phần này cú thể được truy xuất bởi bất kỳ dũng lệnh nào dự ở trong hay ngoài lớp, assembly mà nú khai bỏo.
private: Khi khụng cú điều khiển truy xuất nào được dựng, mặc nhiờn là private. Thành phần này chỉ cú thể được truy xuất trong lớp của nú, mọi đoạn mó nằm ngoài lớp, kể cả
protected: Liờn quan đến sự kế thừa, thành phần chỉ truy xuất
trong lớp và lớp con của nú.
internal: Thành phần chỉ được truy xuất trong nội bộ một
assembly.
protected internal: Thành phần được truy xuất trong nội bộ
một assembly hoặc là trong bất kỳ lớp con của nú từ bất kỳ
assembly khỏc.
Ngoài ra trong định nghĩa phương thức tĩnh của một lớp, khụng
thể truy xuất trực tiếp biến đối tượng và phương thức đối tượng trong
lớp đú, chỉ cho phộp truy xuất biến tĩnh và phương thức tĩnh.
Vớ dụ:
class SomeClass {
// Truy cập được ở bất kỳ đõu
public void PublicMethod(){}
// Chỉ truy cập được trong lớp SomeClass
private void PrivateMethod(){}
// Truy cập được trong lớp SomeClass và cỏc lớp kế thừa
protected void ProtectedMethod(){} // Truy cập được trong cựng một assembly internal void InternalMethod(){}
// Truy cập được trong lớp và cỏc lớp kế thừa trong cựng assembly protected internal void ProtectedInternalMethod(){}
// Mặc định là private trong C# void SomeMethod(){}
}
class Test {
static void Main(string[] args) {
SomeClass c = new SomeClass(); c.PublicMethod();
c.ProtectedInternalMethod(); //Lỗi c.PrivateMethod(); //Lỗi c.ProtectedMethod(); //Lỗi c.SomeMethod(); //Lỗi } } 3.2.3. Phương thức Main()
Dạng tổng quỏt của phương thức Main()
[public] static void Main(string args[]) {
// Thõn phương thức
}
[public] static int Main(string args[]) {
// Thõn phương thức
}
Ứng dụng chỉ cú một lớp cú phương thức Main() là phương
thức được thực hiện đầu tiờn mỗi khi thực hiện ứng dụng. Từ khoỏ static cho phộp phương thức Main() được gọi khi
khụng cần khởi tạo đối tượng. Vỡ phương thức Main() được gọi đầu tiờn trước khi bất kỳ đối tượng nào được khởi tạo.
Từ khoỏ void cho biết phương thức Main() khụng trả về giỏ trị, từ khúa int cho biết phương thức Main() cú trả về giỏ trị
số nguyờn.
Tham đối string args[ ] là một mảng cỏc chuỗi ký tự, chứa