没有身体的吸气,塞特与

时间:2016-05-23 13:25:05

标签: c# automatic-properties

我有一个当前自动的属性。

public string MyProperty { get; set; }

但是,我现在需要它在每次更改时执行一些操作,所以我想向setter添加逻辑。所以我想做一些事情:

public string MyProperty {
    get;
    set { PerformSomeAction(); }
}

然而,这并不构建...... MyProperty.get' must declare a body because it is not marked abstract, extern, or partial

我不能让getter返回MyProperty因为它会导致无限循环。

有没有办法做到这一点,还是我必须声明一个私有变量来引用?我并不是因为MyProperty在本课程及其之外的代码中被使用了

5 个答案:

答案 0 :(得分:12)

您需要使用具有支持字段的属性:

NULL

答案 1 :(得分:3)

你不能在没有另一个的情况下实现一个,因为当使用它引用的(隐藏的)后备字段时,在自动生成的属性的情况下自动生成。但是,当您实现一个时,您必须以两种方式设置此后备字段。

自动方式只是一个捷径:

private string _property;
public string MyProperty
{
    get { return _property; }
    set { _property = value; }
}

因此,如果您省略其中一个方法中的隐藏字段(这实际上是getter和setter),该方法应该如何知道如何存储/获取值?

答案 2 :(得分:1)

你需要为getter和setter提供一个body,或者两者都不提供。

因此,如果您定义其中任何一个,它就不再是自动属性。

所以你必须这样做:

无论

public string MyProperty {
    get;
    set;
}// Automatic property, no implementation

OR

public string MyProperty
{
    get { return mMyProperty; }
    set
    {
        mMyProperty = value;
        PerformSomeAction();
    }
}

答案 3 :(得分:0)

如果您在setter中执行某些操作,则必须显式声明该变量。 E.g。

private string _myProperty;
public string MyProperty {
    get { return _myProperty; };
    set 
    {
        _myProperty = value; 
        PerformSomeAction(); 
    }
}

或 - 在setter中你可以将值传递给函数并在那里做你想做的事情......假设你想要改变/检查函数PerformSomeAction()中的值

答案 4 :(得分:0)

这与问题C# getter and setter shorthand类似。

当您手动指定一个setter时,它不会使用getter的自动属性机制,这就是为什么错误消息就像缺少它一样。指定setter时,您需要编写自己的getter。