没有身体的吸气,塞特与
我有一个目前自动的属性。
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
在这个类和它之外的代码中被使用
您需要使用具有支持字段的属性:
private string mMyProperty; public string MyProperty { get { return mMyProperty; } set { mMyProperty = value; PerformSomeAction(); } }
你不能在没有另一个的情况下实现一个,就像使用它所指的那个(隐藏的)后备字段一样,它是在自动生成属性的情况下自动生成的。 但是,当您实现一个时,您必须以两种方式设置此后备字段。
自动方式只是一个捷径:
private string _property; public string MyProperty { get { return _property; } set { _property = value; } }
因此,如果您省略其中一个方法中的隐藏字段(这实际上是getter和setter),该方法应该如何知道如何存储/获取值?
你需要为getter和setter提供一个body,或者两者都不提供。
因此,如果您定义其中任何一个,它就不再是自动属性。
所以你必须这样做:
或
public string MyProperty { get; set; }// Automatic property, no implementation
要么
public string MyProperty { get { return mMyProperty; } set { mMyProperty = value; PerformSomeAction(); } }
如果您在setter中执行某些操作,则必须显式声明该变量。 例如
private string _myProperty; public string MyProperty { get { return _myProperty; }; set { _myProperty = value; PerformSomeAction(); } }
或者 – 在setter中你可以将值传递给函数并在那里做你想要的…假设你想要改变/检查函数PerformSomeAction()
的值
这类似于问题C#getter和setter的简写 。
当您手动指定一个setter时,它不会使用getter的自动属性机制,这就是为什么错误消息就像缺少它一样。 指定setter时,您需要编写自己的getter。