Các lớp là các kiểu tham chiếu và các cấu trúc là các kiểu giá trị.
Khi tôi nói Classes là kiểu tham chiếu,
về cơ bản chúng sẽ chứa địa chỉ của một biến thể hiện.
Ví dụ:
Class MyClass
{
Public Int DataMember; //By default, accessibility of class data members
//will be private. So I am making it as Public which
//can be accessed outside of the class.
}
Trong phương thức chính,
tôi có thể tạo một thể hiện của lớp này bằng toán tử mới phân bổ bộ nhớ cho lớp này
và lưu địa chỉ cơ sở của biến đó vào biến loại MyClass (_myClassObject2).
Static Public void Main (string[] arg)
{
MyClass _myClassObject1 = new MyClass();
_myClassObject1.DataMember = 10;
MyClass _myClassObject2 = _myClassObject1;
_myClassObject2.DataMember=20;
}
Trong chương trình trên, MyClass _myClassObject2 = _myClassObject1; hướng dẫn chỉ ra rằng cả hai biến kiểu MyClass
- myClassObject1
- myClassObject2
và sẽ trỏ đến cùng một vị trí bộ nhớ.
Về cơ bản, nó gán cùng một vị trí bộ nhớ vào một biến khác cùng loại.
Vì vậy, nếu bất kỳ thay đổi nào chúng ta thực hiện trong bất kỳ một trong các đối tượng loại MyClass sẽ có ảnh hưởng đến một đối tượng khác
vì cả hai đều trỏ đến cùng một vị trí bộ nhớ.
"_myClassObject1.DataMember = 10;" tại dòng này cả thành viên dữ liệu của đối tượng sẽ chứa giá trị 10.
"_myClassObject2.DataMember = 20;" tại dòng này cả thành viên dữ liệu của đối tượng sẽ chứa giá trị 20.
Cuối cùng, chúng ta đang truy cập các bảng dữ liệu của một đối tượng thông qua các con trỏ.
Không giống như các lớp, cấu trúc là các loại giá trị. Ví dụ:
Structure MyStructure
{
Public Int DataMember; //By default, accessibility of Structure data
//members will be private. So I am making it as
//Public which can be accessed out side of the structure.
}
Static Public void Main (string[] arg)
{
MyStructure _myStructObject1 = new MyStructure();
_myStructObject1.DataMember = 10;
MyStructure _myStructObject2 = _myStructObject1;
_myStructObject2.DataMember = 20;
}
Trong chương trình trên,
khởi tạo đối tượng của kiểu
MyStr struct bằng cách sử dụng toán tử mới và lưu địa chỉ vào biến _myStabaseObject của loại MyStr struct và
gán giá trị 10 cho thành viên dữ liệu của cấu trúc bằng cách sử dụng "_mySturationObject1.DataMember = 10".
Trong dòng tiếp theo,
tôi đang khai báo một biến khác _myStabaseObject2 thuộc loại MyStr struct và gán _mySturationObject1 vào đó.
Ở đây trình biên dịch .NET C # tạo một bản sao khác của đối tượng _myStr structObject1 và
gán vị trí bộ nhớ đó vào biến MyStr struct _mySturationObject2.
Vì vậy, bất kỳ thay đổi nào chúng tôi thực hiện trên _myStabaseObject1 sẽ không bao giờ có ảnh hưởng đến một biến khác _mySturationObject2 của loại MyStabaserue.
Đó là lý do tại sao chúng ta đang nói Cấu trúc là loại giá trị.
Vì vậy, lớp Cơ sở trực tiếp cho lớp là Đối tượng và Lớp Cơ sở ngay lập tức cho Cấu trúc là ValueType kế thừa từ Đối tượng.
Các lớp sẽ hỗ trợ Kế thừa trong khi Cấu trúc sẽ không.
Làm thế nào chúng ta nói điều đó?
Và lý do đằng sau đó là gì?
Câu trả lời là Lớp học.
Nó có thể là trừu tượng, niêm phong, tĩnh và một phần và không thể là Riêng tư, Được bảo vệ và bảo vệ nội bộ.