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?

Văn Dương viết 11:39 ngày 01/10/2018

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.

Tao Không Ngu. viết 11:40 ngày 01/10/2018

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.

viết 11:40 ngày 01/10/2018

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án List2 = List1 thì như gán con trỏ = con trỏ rồi, cả List1 và List2 cùng trỏ tới 1 obj.

TinBubu viết 11:39 ngày 01/10/2018

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?

Văn Dương viết 11:52 ngày 01/10/2018

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.

Trần Hoàn viết 11:54 ngày 01/10/2018

Có vẻ ref là đặc tính riêng của List, chính xác hơn là phép gán của List. Vì mình thử với var a = new int();var b = a; thì 2 cái vẫn không liên quan gì đến nhau.

viết 11:48 ngày 01/10/2018

C# reference cũng là 1 loại con trỏ thôi, như managed pointer trong C++ CLI gì đó

Văn Dương viết 11:51 ngày 01/10/2018

C# mặc định không có con trỏ rồi.

rogp10 viết 11:46 ngày 01/10/2018

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

Văn Dương viết 11:43 ngày 01/10/2018

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).

Bài liên quan
0