2011-01-19 30 views
10

Câu hỏi của tôi là:Trong C#, sử dụng các loại giá trị so với các loại tài liệu tham khảo

  • Khi chúng ta nên sử dụng các loại giá trị và khi loại tài liệu tham khảo?
  • Những ưu điểm và nhược điểm của cái khác?
  • Điều gì sẽ xảy ra nếu một người sử dụng loại tham chiếu ở mọi nơi? Có bất kỳ tác hại nào trong đó không?

Cũng hãy thảo luận về các ưu điểm và nhược điểm của từng loại. Tôi cũng muốn hiểu điều đó.

+2

Nếu bạn không thể quyết định, nó gần như chắc chắn là một 'lớp'. Nó là cực kỳ hiếm để * hợp pháp * viết một cấu trúc. –

+1

Đối với các lập trình viên Thổ Nhĩ Kỳ, tôi có một bài đăng trên blog về nó http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ –

Trả lời

4

Dường như có rất nhiều sự nhầm lẫn về điều này, và Jon Skeet thực hiện một công việc tốt trong việc xóa nó trong cuốn sách "C# In Depth, 2nd Ed." (phần 2.3).

Cách tiếp cận cá nhân của tôi, có thể hoặc không đúng, CHỈ sử dụng cấu trúc/liệt kê (loại giá trị) để thể hiện cấu trúc dữ liệu nguyên tử, nhẹ mà tôi biết tôi sẽ sử dụng thường xuyên trong một số loại logic hoặc toán học hoạt động - hãy suy nghĩ Point, v.v.

Bằng cách đó tôi có thể tránh được hình phạt về hiệu suất thu gom rác thải. Tuy nhiên, Jon chỉ ra trong phần đó của cuốn sách của mình rằng không có đảm bảo thực sự, đặc biệt là trong các phiên bản mới của thời gian chạy, cho dù một cái gì đó sẽ đi trên ngăn xếp ở tất cả.

Vì vậy, câu trả lời hay nhất của tôi là sử dụng những thứ như cấu trúc một cách tiết kiệm và rất ý thức về lý do bạn sử dụng chúng nếu bạn làm như vậy. Xem ra để tối ưu hóa sớm. Và đọc phần đó trong cuốn sách của Jon nếu bạn có thể đặt tay lên một bản sao, bởi vì anh ấy làm tốt công việc làm rõ toàn bộ chủ đề này.

liên quan: When to use struct?

7

Sử dụng các loại giá trị cho bất biến không có nhận dạng riêng của chúng (số 1 là 1), sử dụng các loại tham chiếu cho những thứ khác.

+5

Các chuỗi có nên có danh tính không? :) –

+0

Vì vậy, một "1" "không phải là một" "1" '? – jason

+0

@Jon - trường hợp đặc biệt ... và người ta có thể cho rằng các chuỗi nên được triển khai dưới dạng các loại giá trị. Rất thích nghe nhận của bạn trên đó. – Oded

9

Bạn nên sử dụng các loại giá trị cho nhỏ, không thay đổi các loại đại diện cho các giá trị.
Never make mutable structs.

Đối với mọi thứ khác, hãy sử dụng các loại tham chiếu.

+1

+1 với sự nhấn mạnh vào * nhỏ *. (copy-on-assignment) –

+1

bài đăng của bạn không giải thích lý do tại sao một người nên sử dụng các loại giá trị? – Nawaz

2

http://www.albahari.com/valuevsreftypes.aspx

đây là tài liệu tham khảo của tôi về điểm này. Tôi chủ yếu sử dụng các loại tham chiếu tbh. Các lớp IE và không cấu trúc. Điểm chính thường được nói là các cấu trúc chỉ nên được sử dụng cho các mẩu thông tin nhỏ. Thực sự phụ thuộc vào hoàn cảnh chính xác. Có một cái nhìn vào khung .net trong trình duyệt đối tượng sẽ giúp đỡ, bạn sẽ thấy những gì những kẻ microsoft đã làm và bạn có thể phân tích lý do tại sao họ đã thực hiện một số lớp học và cấu trúc.

1

Bất biến kiểu giá trị và các loại tài liệu tham khảo không thay đổi ngữ nghĩa tất cả nhưng giống hệt nhau; sự khác biệt duy nhất là các kiểu tham chiếu hỗ trợ kiểm tra bình đẳng tham chiếu có thể hoặc không có ý nghĩa, và các kiểu giá trị có thể được bọc trong một Nullable (Of T) trong khi các kiểu tham chiếu là vô hiệu. Nếu một loại sẽ là bất biến, tùy thuộc vào cách nó sẽ được sử dụng, có thể có lý do hiệu suất để ủng hộ một cấu trúc hoặc một lớp; cấu trúc là nhanh hơn cho một số hoạt động (gần như tất cả các hoạt động, cho kích thước ít hơn bốn byte), trong khi các lớp có thể nhanh hơn cho một số người khác (đặc biệt là cho những thứ lớn hơn 16 byte). Hơn nữa, một số loại hoạt động cơ bản là không thể với cấu trúc.

Các loại cấu trúc có thể thay đổi hữu ích, trái ngược với những gì một số người yêu cầu bồi thường yêu cầu, nhưng có một số cảnh báo. Nếu có một biến chứa tham chiếu đến một đối tượng lớp có thể thay đổi và một đối tượng nào đó thay đổi đối tượng đó, thay đổi đó sẽ được "nhìn thấy" hiệu quả bởi mọi thứ chứa tham chiếu đến đối tượng đó. Nếu một người muốn thay đổi một đối tượng mà không làm phiền bất cứ điều gì khác, người ta phải biết rằng một người giữ chỉ tham chiếu đến đối tượng đó. Thông thường, cách duy nhất để đảm bảo điều này là sao chép tất cả dữ liệu từ đối tượng vào một cá thể đối tượng mới và sau đó thực hiện thay đổi đối với cá thể mới đó. Ngược lại, nếu người ta có cấu trúc có thể thay đổi, người ta có thể đơn giản thực hiện bất kỳ thay đổi nào mà người ta muốn mà không phải tạo một cá thể mới. Vấn đề thực sự duy nhất với cấu trúc có thể thay đổi là .net sử dụng các trừu tượng khác nhau để làm cho chúng hoạt động như một phần của hệ thống kiểu thống nhất, và những trừu tượng này có thể gây ra các bản sao của cấu trúc được sử dụng ở những nơi mà bản gốc hợp lý nên được sử dụng . Nó không phải luôn luôn rõ ràng khi những thay thế này có thể xảy ra, và họ có thể dẫn đến hành vi khó hiểu và sai lầm.

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