正确编码直接访问属性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