คุณสมบัติ C #: จะใช้คุณสมบัติชุดที่กำหนดเองโดยไม่มีฟิลด์ส่วนตัวได้อย่างไร


96

ฉันต้องการทำสิ่งนี้:

public Name
{
    get;
    set
    {
        dosomething();
        ??? = value
    }
}

เป็นไปได้ไหมที่จะใช้ฟิลด์ส่วนตัวที่สร้างขึ้นโดยอัตโนมัติ
หรือจำเป็นต้องใช้วิธีนี้:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}

2
มีการอภิปรายดีๆมากมายในคำถาม SO นี้: stackoverflow.com/questions/1277018/…
David Hall

คำตอบ:


104

เมื่อคุณต้องการทำอะไรที่กำหนดเองใน getter หรือ setter คุณจะไม่สามารถใช้คุณสมบัติอัตโนมัติได้อีกต่อไป


39

คุณสามารถลองสิ่งนี้:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}

6
+1 ในใจของฉันคำตอบนี้ตำหนิคำตอบที่ยอมรับ มันกำลังใช้คุณสมบัติอัตโนมัติ ตั้งค่าตัวตั้งค่าเป็นส่วนตัวอย่างชัดเจน นี่เป็นสิ่งที่ดีเพราะช่วยให้ผู้ใช้หรือนักพัฒนารู้ว่ามีแนวโน้มที่จะเกิดขึ้นเบื้องหลังวิธีการตั้งค่า
ooXei1sh

อะไรคือความแตกต่างระหว่างสิ่งนี้กับไม่ได้ตั้งค่าเลย?
Sidhin S Thomas

3
@SidhinSThomas ไม่ให้private setจะป้องกันไม่ให้ทรัพย์สินถูกกำหนดโดยสมาชิกของชั้นเรียน มันจะเป็นแบบอ่านอย่างเดียวอย่างเคร่งครัด คุณจะสามารถตั้งค่าข้อมูลในตัวสร้างเท่านั้น
Bondolin

15

นี้เป็นไปไม่ได้ คุณสมบัติที่ใช้งานอัตโนมัติหรือรหัสที่กำหนดเอง


11

ใน C # 7 คุณสามารถใช้นิยามเนื้อหานิพจน์สำหรับคุณสมบัติgetและsetตัวเข้าถึง

ดูเพิ่มเติมที่นี่

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}

4
ยังคงใช้สนามส่วนตัวอยู่ ไม่ได้ช่วย OP จริงๆ
TSmith

แม้ว่าจะได้ผล แต่ก็เหมือนที่ @TSmith กล่าวไว้ไม่ใช่สิ่งที่ OP ต้องการ
M.Ruiz

7

คุณจำเป็นต้องใช้มันอย่างเต็มที่ตามสถานการณ์ของคุณ ทั้งสองอย่างgetและsetต้องติดตั้งโดยอัตโนมัติหรือใช้งานทั้งหมดร่วมกันไม่ใช่ทั้งสองอย่างรวมกัน

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