C#属性:如何在没有私有字段的情况下使用自定义集合属性?


93

我想做这个:

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

是否可以使用自动生成的私有字段?
还是要求我以这种方式实现它:

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

2
有很多关于这个好讨论这个太问题:stackoverflow.com/questions/1277018/...
大卫厅

Answers:


102

一旦要在getter或setter中执行任何自定义操作,就无法再使用auto属性。


37

您可以尝试如下操作:

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

6
+1在我看来,这个答案是接受的答案。它正在使用自动属性。它将setter显式设置为private。这是一件好事,因为它使最终用户或开发人员知道setter方法背后可能还有更多事情要做。
ooXei1sh 2015年

这与根本没有设置有什么区别?
Sidhin S Thomas

3
@SidhinSThomas不提供a private set会阻止该属性由其类的成员设置;它将严格是只读的。您将只能在构造函数中设置其数据。
Bondolin '19

15

这是不可能的。自动实现的属性或自定义代码。


11

从C#7开始,您可以将表达式主体定义用于属性getset访问器。

在这里查看更多

private string _name;

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

4
虽然仍在使用私有字段。并不能真正帮助OP。
TSmith

虽然这可行,但就像@TSmith所说,这不是OP想要的。
M. Ruiz

7

要求您根据情况完全实施它。双方getset必须是自动实现或完全实行起来,而不是两者的结合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.