2011-01-19 27 views
15

Vâng, tôi đã nhìn vào Generics và có câu dưới đây:Danh sách <T> - tôi có chuyển đối tượng hoặc tham chiếu không?

List<someClass> list=new List<someClass> 

SomeClass MyInstance=SomeClass(); 

list.Add(MyInstance); 

Tôi không chắc chắn những gì sẽ được thêm vào danh sách - tài liệu tham khảo hoặc đối tượng của loại tài liệu tham khảo (trỏ đến giá trị thực tế của MyInstance).
EDIT: Hoặc tôi sẽ thêm giá trị (đó là kiểu dữ liệu tham chiếu) trỏ đến đối tượng thực tế?

Cảm ơn

+2

Các lớp luôn được chuyển thành tham chiếu – Sklivvz

+3

@Skliwz: "Các lớp luôn được chuyển thành tham chiếu" Trước hết, các lớp không được truyền qua bất kỳ đâu. Có các đối tượng và, cho mục đích của chúng tôi (có nghĩa là tôi đang ẩn một số chi tiết), chúng là trường hợp của các loại giá trị hoặc các thể hiện của các loại tham chiếu. Thứ hai, trừ khi một tham số được đánh dấu bằng 'ref' hoặc' out', nó được PASSED BY VALUE.Tôi sẽ lặp lại rằng: tất cả các tham số, trừ khi được đánh dấu bằng 'ref' hoặc' out' được truyền theo giá trị, có hay không tham số là một thể hiện của một loại giá trị hoặc một thể hiện của một kiểu tham chiếu. Đối với các loại tham chiếu, giá trị là tham chiếu. – jason

Trả lời

20

Khi bạn đối phó với các loại tài liệu tham khảo bạn luôn luôn đối phó với sự tham khảo, do đó, một tài liệu tham khảo sẽ được thêm vào danh sách (một bản sao của tài liệu tham khảo thực tế). Bạn không thực sự có lựa chọn; đó là cách ngôn ngữ hoạt động.

+0

angren: Ngoài ra, giá trị của loại tham chiếu cũng sẽ được thêm vào danh sách. Và giá trị này trỏ tới đối tượng trên heap – Lojol

+0

Vâng, tôi đã nói ngay tại đây: "một bản sao của tài liệu tham khảo thực sự" –

4

someClass là loại tham chiếu, tham chiếu đến MyInstance sẽ được sao chép vào danh sách.

6

Giả sử someClass là loại tham chiếu (ví dụ: lớp) và không phải là loại giá trị (ví dụ: struct), sau đó là tham chiếu.

Ngoài ra tôi thừa nhận nó sẽ là khá devilish để xác định một cấu trúc với tên SomeClass

struct someClass

Và đây là obligatory link đến bài viết Jon Skeet trên tham số đi qua.

1

một tham chiếu sẽ được bổ sung từ MyInstance là loại tài liệu tham khảo

-1

Danh sách này sẽ lưu trữ các tài liệu tham khảo của đối tượng thay vì những trường hợp đối tượng.

Thực ra, giá trị Lưu trữ danh sách theo mảng và mảng lưu trữ tham chiếu trên ngăn xếp và lưu trữ đối tượng đối tượng trên vùng heap.

+0

Không chính xác. Các tài liệu tham khảo được lưu trữ trên heap. Tham chiếu đến 'List <>' chính nó * có thể * nằm trong ngăn xếp, nhưng tham chiếu nó chứa thì không. –

-1

Nếu bạn định đoạt đối tượng của bạn như sau

MyInstance = null 

sau đó, bạn không thể đọc được các đối tượng MyInstance,

nhưng bạn vẫn có thể đọc các đối tượng trong danh sách,

vì bạn có hai tham chiếu trỏ đến MyInstance,

Nói cách khác, đối tượng có hai tham chiếu,

một là

SomeClass MyInstance=SomeClass(); 

kia đang được lưu trữ trong danh sách,

và bạn chỉ cần vứt bỏ một trong số họ,

vì vậy bạn vẫn có thể đọc danh sách [0]

+0

Câu hỏi đặt ra là có hay không có tham chiếu hoặc giá trị trong danh sách, câu trả lời là * tham chiếu *, như đã được trả lời. –

+0

Đặt biến thành 'null' là * không * 'xử lý'. –

Các vấn đề liên quan