我看过一些代码并认为它似乎有问题,所以我想知道它是否可以接受良好的编码,我的第一个想法是否定的。
考虑:
class MyClass
{
private string m_MySuperString;
public string MySuperString
{
get { return m_MySuperString; }
set { m_MySuperString = value; }
}
public void MyMethod()
{
if (blah != yada)
{
m_MySuperString = badabing;
}
}
public void MyOtherMethod()
{
if (blah == yada)
{
m_MySuperString = badaboom;
}
}
}
这种对 Backing Field 的直接访问是一种可接受的做法还是糟糕的编码 - 或者我应该问 Property Accessor 的意义是什么,如果这是在具有公共(public)成员的类内部完成的,访问是多个组件允许 - 是否可能发生崩溃 - 我会冒险在多线程应用程序中发生崩溃。
请问有什么想法吗? 我看过这个Link在 SO 和其他人> Why use private members then use public properties to set them?
编辑
让我说清楚,因为提供了很好的信息,而是直接回复所有答案和评论。 我不是在问属性的用途,不是问我是否可以自动实现属性、私有(private) setter 、OnValueChange 通知、属性逻辑。 我的问题是关于直接访问该支持字段 - 例如,如果你说一个多线程场景 - getter/setter 上同步时钟的全部意义不是控制对支持字段的访问吗?这种代码在那种情况下是否可以接受 - 只需向 getter 和 setter 添加一个 syncLock ?请记住,myClass 的构造函数中的代码只是一个示例 - 代码可以在任何其他方法中 - 例如更新的类 - Method1
结束编辑
最佳答案
面向对象编程 (OOP) 中的属性有助于执行 Encapsulation .这个想法是只允许对象本身与其自己的数据(即字段)进行交互。只能通过方法从外部访问对象的数据。例如,在 Java 中,您必须显式编写 get 和 set 方法。 C# 中的属性有一种特殊的语法,将这两种方法结合在一个结构中,但 getter 和 setter 实际上是方法。
这也意味着绝对允许一个对象直接访问它自己的字段。
但是,在某些情况下,属性 getter 和 setter 会执行额外的逻辑。 setter 可能引发 PropertyChanged
事件或进行一些验证。 getter 可能会组合多个字段或生成格式化或计算值。如果您需要执行此附加逻辑,则必须访问属性而不是字段。如果一个属性是自动实现的,那么你别无选择(在 C# 中),因为支持字段是隐藏的并且不可访问。 ( In VB it is hidden from IntelliSense but accessible from within the class .)
关于c# - 正确编码直接访问属性 C# 的支持字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37931516/