【发布时间】:2016-06-20 20:45:41
【问题描述】:
我看到了一些代码,并认为它似乎有问题,所以我想知道它是否可以接受良好的编码,我的第一个想法是不。
考虑:
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;
}
}
}
这种对支持字段的直接访问是可接受的做法还是编码不好-或者我应该问一下属性访问器的意义是什么,如果这是在具有公共成员的类内部完成的,访问是多个组件允许 - 是否可能发生崩溃 - 我会冒险在多线程应用程序中发生崩溃。
请问有什么想法吗? 我在 SO 和其他人上看过这个Link> Why use private members then use public properties to set them?
编辑
让我说清楚,因为提供了很好的信息,而是直接回复所有答案和 cmets。 我不是在问属性的用途,也不是我是否可以自动实现属性、私有设置器、OnValueChange 通知、属性逻辑。 我的问题是关于直接访问该支持字段-例如,如果您说的是多线程场景-getter/setter 上的同步锁的重点不是控制对支持字段的访问吗?在那种情况下这种代码是否可以接受 - 只需向 getter 和 setter 添加一个 syncLock ?请记住,myClass 的构造函数中的代码是一个示例 - 代码可以在任何其他方法中 - 例如更新的类 - Method1
结束编辑
【问题讨论】:
-
这真的很主观。我建议查看@JonSkeet 的 C# In Depth 的第 8 章第 1 节,以获取有关自动实现属性的更多信息。简短回答您的问题,不,这段代码没有任何问题。
-
您可以在课堂上做任何您认为需要的事情。该属性用于您与其他类型的接口。如果有帮助,您可以阅读 OO 封装原则。
-
@Chaim Eliyah 好的,所以代码没有问题;关于这个和来自类外部的多线程访问是否有任何问题 - 如果支持字段在内部设置(甚至可能来自类中的两个方法)并且可以在外部完成对属性/方法的访问如何控制访问到支持字段,除了所有访问都通过属性?我认为在这个类上运行多个线程会导致问题 - 还是我完全错了?我认为这就是在属性访问器上放置同步锁的全部意义?
-
您可以预料的是,在多线程应用程序中,
blah或yada的值可能会在执行代码之前发生变化,因此您可能会遇到不可预知的行为。你可以使用locks 或者你可以使用thread-safe container 或者你可以决定你不在乎,因为毕竟这些是托管运行时语言中的内存属性并且相信执行会发生按照预测的顺序。这真的取决于你的设计。 -
@Chaim Eliyah,好的,如果您将 cmets 作为答案发布 - 我会接受。也感谢您提供的链接 - 我会在业余时间阅读更多内容。
标签: c# properties coding-style standards