c #: getter / setter


109

Tôi đã thấy một cái gì đó giống như sau ở đâu đó và đang tự hỏi nó có nghĩa là gì. Tôi biết chúng là getters và setters, nhưng muốn biết tại sao loại chuỗi được định nghĩa như thế này. Cảm ơn vì đã giúp tôi.

public string Type { get; set; }


4
Đây được gọi là Auto-tài sản, có một cái nhìn lúc này: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov

Đây là định nghĩa của một thuộc tính có tên "Type", kiểu .NET System.string. Không có gì hơn với nó.
Jon

2
Tôi nghĩ rằng anh ấy có thể đang nhầm lẫn giữa việc đặt tên Thuộc tính tự động với Loại hệ thống phản chiếu lớp. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Câu trả lời:


178

Đó là các Thuộc tính Tự động Thực hiện (gọi tắt là Thuộc tính Tự động).

Trình biên dịch sẽ tự động tạo tương đương với cách triển khai đơn giản sau:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}

2
@barlop là người đến từ google, không có manh mối, cần cập nhật những gì? M. Hassans có trả lời đúng ý bạn không? cảm ơn.
Aethenosity

1
@Aethenosity khi nhìn lại tôi nghĩ rằng nó ổn .. Tôi đã nghĩ về các ví dụ của getter setter. Người hỏi có một trường hợp hợp lệ của getter setter ngắn gọn hơn nhiều (như một lớp lót / không cần trường thứ hai) .. Bạn cũng có thể viết public int b { get { return b * 2; } } không cần trường thứ hai. Nhưng tôi nghĩ khi bạn có setter với body thì bạn cần trường thứ hai. Và cái này cho thấy một setter với một cơ thể. Mặc dù nó giống như một lớp lót của người hỏi.
barlop

2
@Aethenosity cũng có c # 7, theo đó chắc chắn bạn vẫn cần trường thứ hai khi bộ thiết lập có nội dung, nhưng nó có =>cú pháp và không có từ khóa trả về. Mặc dù đó không phải là điều tôi nghĩ. Tôi đã nghĩ rằng trường thứ hai là không cần thiết, mặc dù từ đó tôi nhận thấy rằng trường thứ hai đôi khi cần thiết. Trong ví dụ ở đây, trường thứ hai là không cần thiết ('vì một setter mặc định không có phần nội dung sẽ thực hiện điều này), nhưng người trả lời đã đưa nó vào (phần nội dung setter và trường thứ hai), để giải thích cho người hỏi dòng của họ mà không có lĩnh vực thứ hai đang làm.
barlop

33

Đó là một thuộc tính tự động và nó là ký hiệu viết tắt cho điều này:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}

4
... ngoại trừ trường không thể truy cập được.
Vlad

7
... đó là lý do tại sao nó được gọi là sự ủng hộ lĩnh vực .
Teoman Soygul vào

5
Tuy nhiên, bạn sẽ có thể nhìn thấy nó như khi <Type>k__BackingFieldphản chiếu.
Vlad

25

Trong C # 6:

Bây giờ có thể khai báo các thuộc tính tự động giống như một trường:

public string FirstName { get; set; } = "Ropert";

Thuộc tính tự động chỉ đọc

public string FirstName { get;} = "Ropert";

13
public string Type { get; set; } 

Không khác gì sau đó làm

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}


5

Thuộc tính được hỗ trợ tự động của nó, về cơ bản tương đương với

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}

4

Chúng được gọi là thuộc tính tự động.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Về mặt chức năng (và về mặt IL đã biên dịch), chúng giống như các thuộc tính có trường hỗ trợ.


1
Bạn vẫn có thể tham chiếu _type hoặc kiểu riêng tư trong lớp hay bạn chỉ sử dụng Kiểu?
mikey

2
Không, NHƯNG bạn có thể chỉ định công cụ sửa đổi cho thuộc tính auto: public string Type {get; bộ riêng; }
Jeff

Bạn sẽ không thể truy cập _type trong trường hợp này.
Security Hound

1
Vì vậy, trong trường hợp này this.Type = "foo"; nên OK, nhưng từ instance bên ngoài.Type = "foo"; sẽ không .. Những đạo cụ tự động này chắc chắn là một bổ sung hữu ích cho ngôn ngữ. Cảm ơn.
mikey

1

Tôi biết đây là một câu hỏi cũ nhưng với việc phát hành C # 6, bây giờ bạn có thể làm điều gì đó như thế này đối với các thuộc tính riêng tư.

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }

2
bạn có thể đặt giá trị ban đầu trực tiếp trong C # 6: public string myProp {get; } = "một số giá trị") không có hàm tạo;
M.Hassan

1

Bạn cũng có thể sử dụng biểu thức lambda

public string Type
{
    get => _type;
    set => _type = value;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.