2012-02-13 35 views
11

Không có tham chiếu (rõ ràng) đối với biến riêng tư firstName mà FirstName được cho là đang ẩn. Bạn có thể giải thích cách làm việc này? Tôi giả sử có một số biến riêng tư đang được định vị và được định vị. Cảm ơn.Ở đâu/biến riêng tư trong thuộc tính được tự động triển khai là gì?

// auto-implemented property FirstName 
public string FirstName { get; set; } 
+0

Đây là một trùng lặp. Xem các liên kết có liên quan ở bên cạnh. – leppie

+0

có thể trùng lặp của [C# 3.0: Thuộc tính tự động - tên của biến riêng tư được tạo bởi trình biên dịch] là gì (http://stackoverflow.com/questions/1277018/c-sharp-3-0-automatic-properties-what- be-be-the-name-of-private-variable-c) – nawfal

Trả lời

25

Về cơ bản trình biên dịch chuyển mã của bạn vào một cái gì đó như thế này:

private string <__>firstName; 

public string FirstName 
{ 
    get { return <__>firstName; } 
    set { <__>firstName = value; } 
} 

Đó là khó có khả năng là tên chính xác, nhưng việc sử dụng các dấu ngoặc nhọn trong tên là quan trọng - bởi vì nó làm cho nó trở thành một tên không rõ ràng . (Đó là thuật ngữ không chính thức, nhưng được sử dụng rộng rãi - tôi không biết liệu Eric Lippert có thực sự đặt ra nó hay không, hoặc liệu anh ta có phải là người đầu tiên sử dụng nó trong thứ tôi đọc không.) Đó là một cái tên không phải là một định danh C# hợp lệ, nhưng CLR khá hài lòng. Có hai lợi ích:

  • Trình biên dịch không cần phải lo lắng về xung đột đặt tên với định danh của bạn
  • Trình biên dịch không cần phải lo lắng về việc liệu bạn đang cố gắng đề cập đến lĩnh vực này trong mã của riêng bạn - bạn không thể, bởi vì cái tên không thể nói được!

Nó sử dụng kỹ thuật tương tự cho tất cả các loại mã khác được tạo ra - các kiểu nặc danh, chức năng mang tính chất khối iterator, vv

+7

Tôi nghĩ rằng tôi đã học được rằng argot từ Anders; Tôi không biết anh ta lấy nó từ đâu. –

8

có, the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors. (c) msdn

EDIT:
Khi bạn xác định một tài sản, trình biên dịch sẽ phát ra 2 phương pháp: get_XXXset_XXX. Khi trình biên dịch C# thấy mã đang cố gắng lấy hoặc thiết lập một thuộc tính, trình biên dịch thực sự phát ra một cuộc gọi đến một trong các phương thức này. (c) "CLR via C#"

2

Những kẻ khác đã trả lời câu này, nhưng một chút biết thêm thông tin ... bạn có thể tìm thấy những lĩnh vực sao lưu vào thời gian chạy sử dụng phản ánh. Tìm kiếm các trường có tên như < < PropertyName >> k__BackingField.

bài khác mà có thể giúp:

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