c #: getter / setter


109

ฉันเห็นบางอย่างต่อไปนี้ที่ไหนสักแห่งและสงสัยว่ามันหมายถึงอะไร ฉันรู้ว่าพวกเขาเป็น getters และ setters แต่อยากรู้ว่าทำไมถึงกำหนด string Type แบบนี้ ขอบคุณทีช่วยฉัน.

public string Type { get; set; }


4
สิ่งนี้เรียกว่าคุณสมบัติอัตโนมัติโปรดดูที่: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov

นี่คือความหมายของสถานที่ให้บริการที่มีชื่อ"Type"ประเภท .NET System.stringซึ่งเป็น ไม่มีอะไรอีกแล้ว
จอน

2
ฉันคิดว่าเขาอาจจะสับสนกับการตั้งชื่อคุณสมบัติอัตโนมัติกับคลาส Reflection System.Type msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

คำตอบ:


178

คุณสมบัติเหล่านี้คือAuto-Implemented Properties (คุณสมบัติอัตโนมัติสั้น ๆ )

คอมไพเลอร์จะสร้างโดยอัตโนมัติเทียบเท่ากับการใช้งานแบบง่ายต่อไปนี้:

private string _type;

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

2
@barlop เป็นคนมาจาก google โดยไม่มีเงื่อนงำอะไรต้องอัพเดท? M. Hassans ตอบว่าคุณหมายถึงอะไร? ขอบคุณ.
Aethenosity

1
@Aethenosity ในการหวนกลับฉันคิดว่ามันโอเค .. ฉันคิดในแง่ของตัวอย่างของ getter setter ผู้ถามมีกรณีที่ถูกต้องของ getter setter ที่รวบรัดกว่ามาก (ในฐานะหนึ่งซับ / ไม่จำเป็นต้องมีฟิลด์ที่สอง) .. คุณยังสามารถเขียนpublic int b { get { return b * 2; } } ฟิลด์ที่สองได้โดยไม่จำเป็น แต่ฉันคิดว่าเมื่อคุณมีเซ็ตเตอร์กับร่างกายคุณก็ต้องมีฟิลด์ที่สอง และอันนี้แสดงเซ็ตเตอร์ที่มีร่างกาย แม้ว่ามันจะเหมือนกับซับในของผู้ถามก็ตาม
barlop

2
@Aethenosity นอกจากนี้ยังมี c # 7 ซึ่งต้องแน่ใจว่าคุณยังต้องการฟิลด์ที่สองเมื่อ setter มี body แต่มี=>ไวยากรณ์และไม่มีคีย์เวิร์ดส่งคืน แม้ว่านั่นไม่ใช่สิ่งที่ฉันคิด ฉันคิดว่าฟิลด์ที่สองไม่จำเป็นแม้ว่าฉันจะพบว่าฟิลด์ที่สองมีความจำเป็นในบางครั้ง ในตัวอย่างที่นี่ฟิลด์ที่สองไม่จำเป็น ('เพราะตัวตั้งค่าเริ่มต้นที่ไม่มีเนื้อความจะทำสิ่งนี้) แต่ผู้ตอบได้ใส่มันลงใน (ตัวเซ็ตเตอร์และฟิลด์ที่สอง) เพื่ออธิบายให้ผู้ถามเข้าใจว่าบรรทัดของพวกเขาคืออะไรโดยไม่มี ฟิลด์ที่สองกำลังทำอยู่
barlop

33

นั่นคือคุณสมบัติอัตโนมัติและเป็นสัญกรณ์ชวเลขสำหรับสิ่งนี้:

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

4
... ยกเว้นว่าช่องสำรองไม่สามารถเข้าถึงได้
Vlad

7
... ซึ่งเป็นเหตุผลที่เรียกว่าการสนับสนุนข้อมูล
Teoman Soygul

5
อย่างไรก็ตามคุณควรจะเห็นมันเหมือนกับการ<Type>k__BackingFieldสะท้อน
Vlad

25

ใน C # 6:

ตอนนี้คุณสามารถประกาศคุณสมบัติอัตโนมัติได้เช่นเดียวกับฟิลด์:

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

คุณสมบัติอัตโนมัติแบบอ่านอย่างเดียว

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



5

เป็นคุณสมบัติที่ได้รับการสนับสนุนโดยอัตโนมัติโดยทั่วไปเทียบเท่ากับ

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

4

สิ่งเหล่านี้เรียกว่าคุณสมบัติอัตโนมัติ

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

ตามหน้าที่ (และในแง่ของ IL ที่คอมไพล์แล้ว) จะเหมือนกับคุณสมบัติที่มีฟิลด์สำรอง


1
คุณยังสามารถอ้างอิง _type ส่วนตัวหรือประเภทภายในคลาสได้หรือคุณแค่ใช้ Type?
mikey

2
ไม่ได้ แต่คุณสามารถระบุตัวปรับแต่งสำหรับคุณสมบัติอัตโนมัติ: สตริงสาธารณะประเภท {get; ชุดส่วนตัว }
เจฟฟ์

คุณจะไม่สามารถเข้าถึง _type ได้ในกรณีนี้
Security Hound

1
ดังนั้นในกรณีนี้ this.Type = "foo"; ควรจะใช้ได้ แต่จากภายนอกเช่นประเภท = "foo"; จะไม่ .. อุปกรณ์ประกอบฉากอัตโนมัติเหล่านี้เป็นส่วนเสริมที่มีประโยชน์ต่อภาษาอย่างแน่นอน ขอบคุณ.
mikey

1

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ด้วยการเปิดตัว C # 6 ตอนนี้คุณสามารถทำสิ่งนี้สำหรับคุณสมบัติส่วนตัวได้

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

public string myProp { get; }

2
คุณสามารถตั้งค่าเริ่มต้นได้โดยตรงใน C # 6: myProp สตริงสาธารณะ {get; } = "ค่าบางค่า") โดยไม่มีตัวสร้าง;
ฮัสซัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.