Nếu không khởi tạo giá trị của biến thành viên thì bộ khởi dựng mặc định sẽ khởi tạo giá trị là 0 mặc định cho biến thành viên có kiểu nguyên. Tuy nhiên, trong trường hợp này biến thành viên Giay được khởi tạo
Ngơn Ngữ Lập Trình C# Gio = Hour; Phut = Minute; } private int Nam; private int Thang; private int Ngay; private int Gio; private int Phut; private int Giay = 30 ; // biến khởi tạo } public class Tester { static void Main() { System.DateTime currentTime = System.DateTime.Now; ThoiGian t1 = new ThoiGian( currentTime ); t1.ThoiGianHienHanh(); ThoiGian t2 = new ThoiGian(2001,7,3,10,5); t2.ThoiGianHienHanh(); } } Kết quả: Hien tai: 5/6/2002 10:15:5 Thoi Gian: 5/6/2002 10:15:5 Hien tai: 5/6/2002 10:15:5 Thoi Gian: 3/7/2001 10:5:30 Nếu không khởi tạo giá trị biến thành viên khởi dựng mặc định khởi tạo giá trị mặc định cho biến thành viên có kiểu nguyên Tuy nhiên, trường hợp biến thành viên Giay khởi tạo giá trị 30: Giay = 30; // Khởi tạo Trong trường hợp khởi tạo thứ hai không truyền giá trị cho biến Giay nên biến lấy giá trị mà ta khởi tạo ban đầu 30: ThoiGian t2 = new ThoiGian(2001, 7, 3, 10, 5); t2.ThoiGianHienHanh(); Xây Dựng Lớp - Đối Tượng 98 Ngôn Ngữ Lập Trình C# Ngược lại, giá trị gán cho biến Giay khởi tạo thứ giá trị chồng lên giá trị khởi tạo Trong ví dụ lần tạo đối tượng ThoiGian ta truyền vào đối tượng DateTime nên hàm khởi dựng thứ thực hiện, hàm gán giá trị cho biến Giay Còn tạo đối tượng ThoiGian thứ hai, hàm khởi dựng thứ hai thực hiện, hàm không gán giá trị cho biến Giay nên biến lưu giữ lại giá trị 30 khởi tạo ban đầu Bộ khởi dựng chép Bộ khởi dựng chép thực việc tạo đối tượng cách chép tất biến từ đối tượng có kiểu liệu Ví dụ muốn đưa đối tượng ThoiGian vào khởi dựng lớp ThoiGian để tạo đối tượng ThoiGian có giá trị với đối tượng ThoiGian cũ Hai đối tượng hoàn toàn khác giống giá trị biến thành viên khởi dựng Ngôn ngữ C# không cung cấp khởi dựng chép, phải tự tạo Việc chép thành phần từ đối tượng ban đầu cho đối tượng sau: public ThoiGian( ThoiGian tg) { Nam = tg.Nam; Thang = tg.Thang; Ngay = tg.Ngay; Gio = tg.Gio; Phut = tg.Phut; Giay = tg.Giay; } Khi ta chép từ đối tượng ThoiGian hữu sau: ThoiGian t2 = new ThoiGian( t1 ); Trong t1 đối tượng ThoiGian tồn tại, sau lệnh thực xong đối tượng t2 tạo đối tượng t1 Từ khóa this Từ khóa this dùng để tham chiếu đến thể hiện hành đối tượng Tham chiếu this xem trỏ ẩn đến tất phương thức khơng có thuộc tính tĩnh lớp Mỗi phương thức tham chiếu đến phương thức khác biến thành viên thông qua tham chiếu this Tham chiếu this sử dụng thường xuyên theo ba cách: Sử dụng biến thành viên bị che lấp tham số đưa vào, trường hợp sau: public void SetYear( int Nam) { this.Nam = Nam; Xây Dựng Lớp - Đối Tượng 99 Ngơn Ngữ Lập Trình C# } Như đoạn mã phương thức SetYear thiết lập giá trị biến thành viên Nam, nhiên tham số đưa vào có tên Nam, trùng với biến thành viên, nên ta phải dùng tham chiếu this để xác định rõ biến thành viên tham số truyền vào Khi this.Nam đến biến thành viên đối tượng, Nam đến tham số Sử dụng tham chiếu this để truyền đối tượng hành vào tham số phương thức đối tượng khác: public void Method1( OtherClass otherObject ) { // Sử dụng tham chiếu this để truyền tham số // thân đối tượng thực otherObject.SetObject( this ); } Như cho thấy cần truyền tham số thân đối tượng thực ta bắt buộc phải dùng tham chiếu this để truyền Các thứ ba sử dụng tham chiếu this mảng mục (indexer), phần trình bày chi tiết chương Sử dụng thành viên tĩnh (static member) Những thuộc tính phương thức lớp thành viên thể (instance members) hay thành viên tĩnh (static members) Những thành viên thể hay thành viên đối tượng liên quan đến thể kiểu liệu Trong thành viên tĩnh xem phần lớp Chúng ta truy cập đến thành viên tĩnh lớp thông qua tên lớp khai báo Ví dụ có lớp tên Button có hai thể lớp tên btnUpdate btnDelete Và giả sử lớp Button có phương thức tĩnh Show() Để truy cập phương thức tĩnh ta viết : Button.Show(); Đúng viết: btnUpdate.Show(); Ghi chú: Trong ngôn ngữ C# không cho phép truy cập đến phương thức tĩnh biến thành viên tĩnh thông qua thể hiện, cố làm điều trình biên dịch C# báo lỗi, điều khác với ngơn ngữ C++ Trong số ngơn ngữ có phân chia phương thức lớp phương thức khác (tồn cục) tồn bên ngồi khơng phụ thuộc lớp Tuy nhiên, điều không cho phép C#, ngôn ngữ C# không cho phép tạo phương thức bên lớp, ta tạo phương thức giống cách tạo phương thức tĩnh bên lớp 100 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# Phương thức tĩnh hoạt động nhiều giống phương thức tồn cục, ta truy cập phương thức mà không cần phải tạo thể hay đối tượng lớp chứa phương thức tồn cục Tuy nhiên, lợi ích phương thức tĩnh vượt xa phương thức tồn cục phương thức tĩnh bao bọc phạm vi lớp nơi định nghĩa, ta khơng gặp tình trạng lộn xộn phương thức trùng tên chúng đặt namespace Ghi chú: Chúng ta không nên bị cám dỗ việc tạo lớp chứa toàn phương thức linh tinh Điều tiện cho cơng việc lập trình điều khơng mong muốn giảm tính ý nghĩa việc thiết kế hướng đối tượng Vì đặc tính việc tạo đối tượng xây dựng phương thức hành vi xung quanh thuộc tính hay liệu đối tượng Gọi phương thức tĩnh Như biết phương thức Main() phương thức tĩnh Phương tĩnh xem phần hoạt động lớp thể lớp Chúng khơng cần có tham chiếu this hay thể tham chiếu tới Phương thức tĩnh truy cập trực tiếp đến thành viên khơng có tính chất tĩnh (nonstatic) Như Main() gọi phương thức không tĩnh bên lớp Ta xem lại đoạn chương trình minh họa ví dụ 4.2: using System; public class Class1 { public void SomeMethod(int p1, float p2) { Console.WriteLine(“Ham nhan duoc hai tham so: {0} va {1}”, p1,p2); } } public class Tester { static void Main() { int var1 = 5; float var2 = 10.5f; Class1 c = new Class1(); c.SomeMethod( var1, var2 ); } } Phương thức SomeMethod() phương thức không tĩnh lớp Class1, để truy cập phương thức lớp cấn phải tạo thể đối tượng cho lớp Class1 Xây Dựng Lớp - Đối Tượng 101 Ngơn Ngữ Lập Trình C# Sau tạo thơng qua đối tượng c ta gọi được phương thức SomeMethod() Sử dụng khởi dựng tĩnh Nếu lớp khai báo khởi tạo tĩnh (static constructor), đảm bảo phương thức khởi dựng tĩnh thực trước thể lớp tạo Ghi chú: Chúng ta điều khiển xác phương thức khởi dựng tĩnh thực Tuy nhiên ta biết thực sau chương trình chạy trước biến đối tượng tạo Theo ví dụ 4.4 ta thêm khởi dựng tĩnh cho lớp ThoiGian sau: static ThoiGian() { Ten = “Thoi gian”; } Lưu ý khơng có thuộc tính truy cập public trước khởi dựng tĩnh Thuộc tính truy cập khơng cho phép theo sau phương thức khởi dựng tĩnh Do phương thức tĩnh nên truy cập biến thành viên không thuộc loại tĩnh, biến thành viên Name bên phải khai báo tĩnh: private static string Ten; Cuối ta thêm dòng vào phương thức ThoiGianHienHanh() lớp ThoiGian: public void ThoiGianHienHanh() { System.Console.WriteLine(“ Ten: {0}”, Ten); System.Console.WriteLine(“ Thoi Gian:\t {0}/{1}/{2} {3}:{4}:{5}”, Ngay, Thang, Nam, Gio, Phut, Giay); } Sau thay đổi ta biên dịch chạy chương trình kết sau: Ten: Thoi Gian Thoi Gian: 5/6/2002 18:35:20 Mặc dù chương trình thực tốt, không cần thiết phải tạo khởi dựng tĩnh để phục vụ cho mục đích Thay vào ta dùng chức khởi tạo biến thành viên sau: private static string Ten = “Thoi Gian”; Tuy nhiên, khởi tạo tĩnh có hữu dụng cần cài đặt số công việc mà thực thông qua chức khởi dựng công việc cài đặt thực lần 102 Xây Dựng Lớp - Đối Tượng ... phương thức bên ngồi lớp, ta tạo phương thức giống cách tạo phương thức tĩnh bên lớp 100 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# Phương thức tĩnh hoạt động nhiều giống phương thức toàn... thiết kế hướng đối tượng Vì đặc tính việc tạo đối tượng xây dựng phương thức hành vi xung quanh thuộc tính hay liệu đối tượng Gọi phương thức tĩnh Như biết phương thức Main() phương thức tĩnh... ); } } Phương thức SomeMethod() phương thức khơng tĩnh lớp Class1, để truy cập phương thức lớp cấn phải tạo thể đối tượng cho lớp Class1 Xây Dựng Lớp - Đối Tượng 101 Ngôn Ngữ Lập Trình C# Sau