Danh mục

Cấu trúc phần cuối

Số trang: 8      Loại file: pdf      Dung lượng: 179.88 KB      Lượt xem: 1      Lượt tải: 0    
Thu Hiền

Phí lưu trữ: miễn phí Tải xuống file đầy đủ (8 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Tạo cấu trúc không gọi new Bởi vì Location là một cấu trúc không phải là lớp, do đó các thể hiện của nó sẽ được tạo trong stack.
Nội dung trích xuất từ tài liệu:
Cấu trúc phần cuốiTạo cấu trúc không gọi new Bởi vì Location là một cấu trúc không phải là lớp, do đó các thể hiện của nó sẽđược tạo trong stack. Trong ví dụ 7.1 khi toán tử new được gọi: Location loc1 = new Location( 200, 300);kết quả một đối tượng Location được tạo trên stack.Tuy nhiên, toán tử new gọi bộ khởi dựng của lớp Location, không giống như vớimột lớp, cấu trúc có thể được tạo ra mà không cần phải gọi toán tử new. Điều nàygiống như các biến của các kiểu dữ liệu được xây dựng sẵn (như int, long, char,..)được tạo ra. Ví dụ 7.2 sau minh họa việc tạo một cấu trúc không sử dụng toán tửnew. Ghi chú: Đây là một sự khuyến cáo, trong ví dụ sau chúng ta minh họa cách tạo một cấu trúc mà không phải sử dụng toán tử new bởi vì có sự khác nhau giữa C# và ngôn ngữ C++ và sự khác nhau này chính là cách ngôn ngữ C# đối xử với những lớp khác những cấu trúc. Tuy nhiên, việc tạo một cấu trúc mà không dùng từ khóa new sẽ không có lợi và có thể tạo một chương trình khó hiểu, tiềm ẩn nhiều lỗi, và khó duy trì. Chương trình họa sau sẽ không được khuyến khích. Ví dụ 7.2: Tạo một cấu trúc mà không sử dụng new.-----------------------------------------------------------------------------using System;public struct Location{ public Location( int xCoordinate, int yCoordinate) { xVal = xCoordinate; yVal = yCoordinate; } public int x { get { }returnxVal; set { xVal = value; } } public int y { get { return yVal; } set { yVal = value; } } public override string ToString() { return (string.Format(“{0} ,{1}”, xVal, yVal)); } // biến thành viên lưu tọa độ x, y public int xVal; public int yVal;}public class Tester{ static void Main() { Location loc1; loc1.xVal = 100; loc1.yVal = 250; Console.WriteLine(“loc1”); }}-----------------------------------------------------------------------------Trong ví dụ 7.2 chúng ta khởi tạo biến thành viên một cách trực tiếp, trước khi gọibất cứ phương thức nào của loc1 và trước khi truyền đối tượng cho phương thứcWriteLine():loc1.xVal = 100; loc2.yVal = 250;Nếu chúng ta thử bỏ một lệnh gán và biên dịch lại: static void Main() { Location loc1; loc1.xVal = 100; //loc1.yVal = 250; Console.WriteLine( loc1 ); }Chúng ta sẽ nhận một lỗi biên dịch như sau: Use of unassigned local variable ‘loc1’Một khi mà chúng ta đã gán tất cả các giá trị của cấu trúc, chúng ta có thể truy cậpgiá trị thông qua thuộc tính x và thuộc tính y: static void Main() { Location loc1; // gán cho biến thành viên loc1.xVal = 100; loc1.yVal = 250; // sử dụng thuộc tính loc1.x = 300; loc1.y = 400; Console.WriteLine( loc1 ); }Hãy cẩn thận với việc sử dụng các thuộc tính. Mặc dù cấu trúc cho phép chúng ta hỗ trợđónggói bằng việc thiết lập thuộc tính private cho các biến thành viên. Tuy nhiên bảnthân thuộc tính thật sự là phương thức thành viên,và chúng ta không thể gọi bất cứphương thức thành viên nào cho đến khi chúng ta khởi tạo tất cả các biến thành viên.Như ví dụ trên ta thiết lập thuộc tính truy cập của hai biến thành viên xVal và yVal làpublicvì chúng ta phải khởi tạo giá trị của hai biến thành viên này bên ngoài của cấu trúc,trước khi các thuộc tính được sử dụng.Câu hỏi và trả lờiCâuhỏi 1: Có sự khác nhau giữa cấu trúc và lớp?Trả lời 1: Đúng có một số sự khác nhau giữa cấu trúc và lớp. Như đã đề cập trong lýthuyếtthì lớp là kiểu dữ liệu tham chiếu còn cấu trúc là kiểu dữ liệu giá trị. Điều này đượcxem làsự khác nhau căn bản giữa cấu trúc và lớp. Ngoài ra cấu trúc cũng không cho phép cóhàm hủy và tạo bộ khởi dựng không tham số tường minh. Cấu trúc cũng khác lớp làcấu trúc là kiểu cô lập tường minh, tức là không cho phép kế thừa từ nó. Và nó cũngkhông kế thừa được từ bất cứ lớp nào khác. Mặc nhiên, các cấu trúc vẫn kế thừa từObject như bất cứ kiểu dữ liệu giá trị nào khác trong C#/.Câuhỏi 2: Trong hai dạng mảng và tập hợp thì lại nào chứa cấu trúc tốt hơn?Trảlời 2: Cấu trúc có hiệu quả khi sử dụng trong mảng hơn là lưu chúng dưới dạng tậphợp. Dạng tập hợp tốt với kiểu dữ liệu tham chiếu.Câuhỏi 3: Cấu trúc được lưu trữ ở đâu?Trả lời 3: Cấu trúc như đã đề cập là kiểu dữ liệu giá trị nên nó được lưu trữ trên stackcủa chương trình. Ngược với kiểu tham chiếu được đặt trên heap.Câuhỏi 4: Khi truyền cấu trúc cho một phương thức thì dưới hình thức nào?Trả lời 4: Do là kiểu giá trị nên khi truyền một đối tượng cấu trúc cho một phương thứcthìnó được truyền dưới dạng tham trị chứ không phải tham chiếu.Câuhỏi 5: Vậy làm thế nào truyền cấu trúc dưới dạng tham chiếu cho một phương thức?Trả lời 5: Cũng giống như truyền tham chiếu một kiểu giá trị như int, long, char. Takhai báo khóa ref cho các tham số kiểu cấu trúc. Và khi gọi phương thức thì thêmtừ khóa ref vào trước đối mục cấu trúc được truyền vào.Câu hỏi thêmCâu hỏi 1: Chúng ta có thể khởi tạo giá trị ban đầu cho các biến thành viên của nó nhưbên dưới được không? Nếu không được tại sao?struct myStruct{ private int mNum = 100; ....}Câuhỏi 2: Sự khác nhau giữa kiểu dữ liệu tham chiếu và kiểu dữ liệu giá trị?Câuhỏi 3: Sự khác nhau giữa bộ khởi dựng của cấu trúc và bộ khởi dựng của lớp?Câu hỏi 4: Có nhất thiết phải dùng từ khóa new để tạo đối tượng kiểu cấu trúc haykhông? Nếu không thì còn cách nào khác nữa?Câu hỏi 5: Quá trình boxing và unboxing có diễn ra với một đối tượng là kiểu cấu trúchay không?Bài tậpBài tập 1: Chương trình sau đây có lỗi. Hãy sửa lỗi, biên dịch, và chạy chương trình.Đoạn lệnh nào gây ra lỗi?-----------------------------------------------------------------------------using System; ...

Tài liệu được xem nhiều: