01/10/2018, 09:39
Hỏi về khởi tạo List trong C#
Mình có 2 List, với cái mảng Input
đã có số sẵn số.
Nếu khai báo thế này thì khi gọi phương thức List1.Clear();
thì List2
cũng bị clear luôn.
var List1 = new System.Collections.Generic.List<int>(Input);
var List2 = List1;
Còn nếu khai báo đúng chuẩn thì không bị:
var List1 = new List<int>(Input);
var List2 = new List<int>(List1);
Vây cao thủ nào giải thích cho mình với?
Bài liên quan
List1 và List2 đều là reference. List1 có 1 íntance khởi tạo bằng new.
List2=list1 thì đương nhiên nó cũng ánh xạ tới instance của list1.
Cái chứa các item là trong instance chứ không phải trong reference.
Hi Trần Hoàn.
Các đối tướng trong C# nếu chỉ gán bình thường thì nó là tham chiếu. Trừ khi gọi hàm clone hoặc hàm tạo sao chép tường minh.
C#/Java cái gì
= new ...
thì cái đó là con trỏ (reference) trỏ tới object thật nằm trên heap. GánList2 = List1
thì như gán con trỏ = con trỏ rồi, cả List1 và List2 cùng trỏ tới 1 obj.Trường hợp 1: Bạn tưởng tượng List 1 là một cái xô đựng đồ, List 2 là một cái xô trống rỗng.
Lấy xô 1 chồng lên xô 2 rồi đem xô 2 đi đổ thì đồ trong xô 1 cũng mất luôn.
Trường hợp số 2: Bạn thấy trong xô thứ nhất có cái gì thì đi mua y chang cái đó bỏ vô xô thứ 2. Sau đó bạn đem xô thứ 1 đi đổ thì chẳng liên quan gì đến xô thứ 2 hết ok
Trí tưởng tượng phong phú không bạn?
reference và con trỏ là khác nhau, nhất là trong C#.
Trong C#, kiểu giống với con trỏ nhất là IntPtr. Hoặc nếu unsafe được bật thì nó được thể hiện bằng dấu * như C/C++ và thường được ép kiểu từ IntPtr sang qua Marshal.
Có vẻ ref là đặc tính riêng của
List
, chính xác hơn là phép gán củaList
. Vì mình thử vớivar a = new int();
vàvar b = a;
thì 2 cái vẫn không liên quan gì đến nhau.C# reference cũng là 1 loại con trỏ thôi, như managed pointer trong C++ CLI gì đó
C# mặc định không có con trỏ rồi.
Coi vậy chứ phức tạp lắm, nó abstract đi nhiều rồi. http://stackoverflow.com/questions/430112/what-is-the-difference-between-a-c-sharp-reference-and-a-pointer
Không có new int().
List là class.
Int là struct.
Đối tượng kiểu class thì có thể không có íntance (có thể gán = null hoặc không khai báo new để tạo instance). Phép gán chỉ là cùng tham chiếu tới 1 instance.
Đối tượng kiểu struct thì luôn có íntance (không thể gán null và phải gán bằng cái gì đó khi khai báo). Phép gán là việc copy instance này sang instance kia. Vẫn là 2 instance riêng biệt).