编程语言
首页 > 编程语言> > 正确编码直接访问属性C#的后备字段

正确编码直接访问属性C#的后备字段

作者:互联网

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

考虑:

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成员的类中内部完成的,则允许多个访问组件-是否可能发生崩溃-我会冒险在多线程应用程序中发生崩溃.

请有什么想法吗?
我已经在SO等上查看了此Link,
Why use private members then use public properties to set them?

编辑

让我清楚一点,因为提供了很好的信息,而是直接回答所有答案和评论.
 我不是在问什么属性,不是我是否可以执行自动实现的属性,私有设置程序,OnValueChange通知,属性逻辑.
我的问题是关于直接访问该后备字段的信息-例如,如果您说过多线程方案-是不是在getters / setter上同步锁的全部内容-控制对后备字段的访问?在这种情况下,这种代码是否可以接受-只需向getter和setter添加syncLock?请记住,myClass构造函数中的代码是一个示例-该代码可以位于任何其他方法中-例如更新的类-Method1

结束编辑

解决方法:

我建议您查看@JonSkeet C#深度的第8章,第1节(出于教育目的,我从中无耻地采用了以下代码片段),以获取有关自动实现的属性的更多信息.简短地回答您的问题,不,这段代码没有错.

考虑以下代码段:

public string Name { get; set; }

被编译为

private string <Name>k__BackingField;
public string Name
{
     get { return <Name>k__BackingField; }
     set { <Name>k__BackingField = value; }
}

…因此编译器已经在为您完成上面的工作.有多种方法可以修改它的功能,但是并不能真正回答问题.本书中提供的线程安全示例如下:

//code above, plus
private static int InstanceCounter { get; set; }
private static readonly object counterLock = new object();

public InstanceCountingPerson(string name, int age) {
    Name = name;
    Age = age;
    lock (counterLock) // safe property access
    {
        InstanceCounter++;
        // and whatever else you have to do with the lock enabled
    }
}

-这也是一个也称为in this SO question的模式.但是,正如那里所指出的,锁可能是(a)可能很慢,(b)可能由于必须在某个时候释放而实际上不能确保其工作已完成,并且(c)依赖于信任系统,因为它们天真的假设任何想要访问该对象的东西都将正确使用锁(并非总是如此,至少在我见过的某些代码中不是:D). getter和setter方法的优点是,您可以为类的任何实例强制使用锁定模式(阅读:如其他人所建议,正确封装字段).

但是,您可能会考虑的另一种模式是控制反转.使用依赖注入容器,您可以指定自己喜欢的线程安全级别.如果您对每个等待对象单例实例的人都感到满意,则可以声明该对象接口的所有引用都引用同一对象(并且必须等待该对象可用),或者可以确定线程安全的该对象的实例应在每次请求时创建.有关更多详细信息,请参见this SO answer.

注意:

对以上想法的任何同行评审批评都将被友善接受并添加到答案中,因为在这一点上,我有点线程安全.

标签:properties,standards,coding-style,c
来源: https://codeday.me/bug/20191026/1940404.html