2010-03-10 83 views
8

Tôi biết một vài khác biệt,Sự khác nhau giữa các loại giá trị và loại tham chiếu trong C# là gì?

  1. Loại giá trị được lưu trữ trên ngăn xếp khi các loại tham chiếu được lưu trữ trên vùng được quản lý.
  2. Biến loại giá trị trực tiếp chứa giá trị của chúng, trong đó các biến tham chiếu chỉ giữ tham chiếu đến vị trí của đối tượng được tạo trên vùng được quản lý.

Có bất kỳ sự khác biệt nào khác mà tôi bỏ sót ... Nếu có, chúng là gì?

+8

đã hỏi nhiều lần về SO .... –

+0

@Wheat, Nhanh chóng tìm kiếm, không, câu hỏi này chưa được hỏi hoặc trả lời trực tiếp. – strager

+3

Tôi không có thời gian để trả lời đầy đủ vào lúc này - nhưng tôi chỉ muốn chỉ ra rằng "các loại giá trị được lưu trữ trên ngăn xếp" là một cách nói quá. Xem http://pobox.com/~skeet/csharp/memory.html. Để biết thêm về các loại tham chiếu so với các loại giá trị, hãy xem http://pobox.com/~skeet/csharp/references.html –

Trả lời

21

Vui lòng đọc: The stack is an implementation detail và không bao giờ lặp lại phân đoạn ngăn xếp đó là điều phân biệt các loại giá trị từ loại tham chiếu trong .NET. CLR có thể chọn phân bổ một biến bất cứ nơi nào nó muốn.

Sự khác biệt quan trọng nhất là trong ngữ nghĩa bài tập. Khi bạn gán một kiểu giá trị cho một biến (hoặc chuyển nó vào một phương thức làm đối số), tất cả dữ liệu được sao chép. Khi bạn chỉ định một kiểu tham chiếu, chỉ một tham chiếu được sao chép - cả hai tham chiếu trỏ đến cùng một cá thể đối tượng trong bộ nhớ.

+0

Bit nói một cách thô lỗ nhưng hey đó là cách tốt nhất tôi học được, như thể bạn bực bội Gandalf và chờ anh ta giải thích nó với bạn với sự khó chịu trong giọng nói của anh ấy, nó có xu hướng dính = D – Coops

2

Như đã đề cập bởi Aaronaught và Eric bài viết trên blog:

Hãy nhớ rằng các quy tắc, các loại tham khảo luôn đi vào Heap, trong khi giá trị các loại luôn đi đến nơi họ đã tuyên bố? Nếu một kiểu giá trị được khai báo bên ngoài một phương thức, nhưng bên trong một kiểu tham chiếu nó sẽ được đặt trong kiểu tham chiếu trên Heap.

0

tôi nghĩ rằng giá trị được mặc nhiên được gán bộ nhớ nhưng không tham khảo các loại họ phải được chỉ định bộ nhớ một cách rõ ràng

14

Dưới đây là một số khác biệt thêm:

  1. loại Giá trị không thể được thừa hưởng, trong khi các loại tài liệu tham khảo có thể
  2. Các loại giá trị được triển khai dưới dạng cấu trúc, các kiểu tham chiếu dưới dạng lớp
  3. Các loại giá trị theo mặc định không thể được gán giá trị null thực (cú pháp là một giải pháp thay thế và vẫn không cho kết quả là đúng null)
  4. Gán loại giá trị cho biến khác hoặc chuyển nó thành tham số trong phương thức, tạo bản sao của nó trong khi có loại tham chiếu biến đại diện cho vị trí bộ nhớ của đối tượng
  5. Nó là một biên dịch lỗi thời gian cho một cấu trúc để khai báo một hàm tạo parameterless rõ ràng, nhưng không áp dụng cho một lớp
  6. . tương tự không áp dụng cho một lớp
  7. Đây là lỗi biên dịch cho một cấu trúc không gán đầy đủ tất cả các thuộc tính trong hàm tạo của nó, nhưng điều này cũng không áp dụng cho một lớp
Các vấn đề liên quan