我使用私有类的实例作为提供给stream.BeginRead操作的状态对象。 (该类对我的主流读/写类是私有的。)
public class MainClass
{
// ...
private class ResponseState
{
public IResponse response;
public Stream stream;
public byte[] buffer = new byte[1024];
}
}
直接通过字段访问课程。在这种情况下,我是否真的应该通过属性提供对类的访问,即使它只用于保持状态?
有兴趣知道其他人做了什么。
答案 0 :(得分:5)
C#语言并不要求它,但出于可维护性的原因,最好不要直接公开字段 - 建议使用属性代替。
请参阅StyleCop SA1401:FieldsMustBePrivate。
TypeName - FieldsMustBePrivate
CheckId - SA1401
类别 - 可维护性规则<强>原因强>
C#类中的字段具有私有的访问修饰符。
规则说明
如果类中的字段被赋予非私有访问权限,则会违反此规则。出于可维护性的原因,应始终将属性用作公开类外部字段的机制,并且应始终使用私有访问声明字段。这允许属性的内部实现随时间改变而不改变类的接口。
允许位于C#结构中的字段具有任何访问级别。
如何修复违规行为
要修复违反此规则的行为,请将该字段设为私有,并添加一个属性以公开该类之外的字段。
如果您的类纯粹是包含类的状态,那么您可以考虑将成员直接放在使用它们的类中。如果你的课程不仅仅是国家(我怀疑它是),那么它应该遵循通常的可维护性规则。
答案 1 :(得分:2)
我想 - 封装在类内外以及类外都很有用。通过熟悉的界面(即属性)汇集对成员的所有访问权限,您可以灵活地在以后更改访问权限而不更改调用代码。
看起来有点矫枉过正,但老实说,给定自动实现的属性,声明属性很容易,你可以继续使用它来给自己最大的灵活性。
答案 2 :(得分:1)
在我的组织中,当一个类是私有或内部的,并且它是一个实体类时,我们使用公共字段来访问它。
但是,由于C#3.0我们使用automatic properties,所以我们总是使用属性来访问私有字段。
无论如何,效果是一样的,在我们的例子中,它是使代码更具可读性。
答案 3 :(得分:0)
最佳做法是为其他类型的每个成员使用属性。 C#3.0的自动属性使这很容易。
答案 4 :(得分:0)
我刚刚在一两个星期前做了一些阅读。有两个阵营。大多数人都说你必须把财产包裹起来,因为我的老师这么说,其他人都这么做。他们说,更容易为财产增加额外的逻辑或更可维护和其他一些弱的原因。另一个阵营称自己为“真正的OO家伙”,如果你使用属性,你做错了(当然有一些例外)。据我所知,你的案件将是例外。实际上,考虑到这一点,他们可能仍然会说你做错了:)只是不能赢。无论如何,他们还说如果你打算使用它们,除非你需要在你的安装者和吸气剂中使用额外的逻辑,否则不要打扰包装。为什么要慢慢减少你的程序。 (显然他们也可以测量速度有多慢)。
我倾向于在字段上使用属性,因为我做了很多MVVM并且需要实现需要它们的INotifyPropertyChanged。在你的情况下,我不担心将它们包裹在属性中只会使无意义的脂肪。但是如果它在一个需要属性的类中,那么我会将它们包装起来以保持类中的相似性。
如果您没有包装它们,并且稍后需要它,那么它是一个右键单击重构 - &gt;封装字段以包装属性,如果您有Resharper。