Nói rằng tôi có một C# struct:Điều gì sẽ xảy ra khi gán cấu trúc mới cho mảng trong C#?
struct Foo{
int mA;
public int A {get {return mA;}}
int mB;
public int B {get {return mB;}}
public Foo(int a, int b)
{
mA = a;
mB = b;
}
}
Và sau đó tôi có thể tạo và mảng của Foo của:
Foo[] foos = new Foo[10];
xảy ra khi tôi làm gì đây?
foos[1] = new Foo(20, 10);
Nếu Foo là một lớp học, Foo [] sẽ giữ một con trỏ đến một đối tượng Foo trên heap, và con trỏ sẽ được thay đổi để đối tượng Foo mới (cái cũ bị bỏ lại để tái chế).
Nhưng vì cấu trúc là loại giá trị, Foo mới (20, 10) chỉ ghi đè vật lý cùng một vị trí bộ nhớ trước đó được lưu giữ bởi foos [1]?
Theo như tôi nhớ, có. Structs là các kiểu giá trị, vì vậy thay vì ghi đè lên tham chiếu tại foos [i] (như bạn sẽ thấy với một lớp), bạn sẽ ghi đè toàn bộ cấu trúc tại vị trí đó trong mảng. Các nhà sưu tập rác sẽ không phải làm sạch các cấu trúc như nó đã được ghi đè vật lý. Để kiểm tra, tính toán kích thước của một mảng Foo khi Foo được khai báo là 'struct' và khi nó được khai báo là một' lớp', về mặt lý thuyết, kích thước phải là 'nElements * IntPtr.Size' cho các lớp và' nElements * sizeof (Foo) 'cho cấu trúc; nhưng tôi chưa bao giờ thử điều này trong C# vì vậy tôi có thể sai. –
Tôi muốn bạn bằng cách nào đó có thể làm cho nó để 'mới' thực sự sẽ ghi đè lên một đối tượng Foo trực tiếp, thay vì tạo và sau đó sao chép. – SimpleVar
@Yorye Tôi nghĩ rằng nó sẽ giống như tuyên bố dài i = 1 + 2; Giá trị 3 được tạo ra từ biểu thức (1 + 2) và sau đó được sao chép vào i. Vì vậy, thực sự, nó không khác với cách ngôn ngữ kiểu C thường hoạt động. – CodeFusionMobile