c# - 正确编码直接访问属性 C# 的支持字段

标签 c# properties coding-style standards

我看过一些代码并认为它​​似乎有问题,所以我想知道它是否可以接受良好的编码,我的第一个想法是否定的。

考虑:

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/

相关文章:

c# - 来自封闭 block 的变量在匿名函数中变为空

objective-c - IOS 设置属性语法问题

python 嵌套属性封装

c# - 无副作用二传手的方法

java - 使类不可序列化的好方法是什么?

java - 通过 PMD 在 java 中记录空构造函数

java - @Override注解怎么写

c# - 在 Visual Studio 中使用 JavaScript

c# - 如何在 Windows Phone 8 的 MVVM 中添加事件处理程序?

c# - 带有句号的 Instagram 搜索标签?