3

我使用私有类的实例作为提供给 stream.BeginRead 操作的状态对象。(该课程对我的主流阅读/写作课程是私有的。)

public class MainClass
{
    // ...

    private class ResponseState
    {
        public IResponse response;
        public Stream stream;
        public byte[] buffer = new byte[1024];
    }
}

直接通过字段访问类。在这种情况下,我是否真的应该通过属性提供对类的访问,即使它仅用于保持状态?

有兴趣知道别人做什么。

4

5 回答 5

5

C# 语言不要求这样做,但出于可维护性的原因,最好不要直接公开字段 - 建议改用属性。

请参阅StyleCop SA1401:FieldsMustBePrivate。

TypeName - FieldsMustBePrivate
CheckId - SA1401
类别 - 可维护性规则

原因

C# 类中的字段具有私有以外的访问修饰符。

规则说明

每当类中的字段被授予非私有访问权限时,就会违反此规则。出于可维护性的原因,应始终将属性用作在类之外公开字段的机制,并且应始终使用私有访问声明字段。这允许属性的内部实现随时间而改变,而不改变类的接口。

位于 C# 结构中的字段允许具有任何访问级别。

如何解决违规问题

要修复违反此规则的行为,请将字段设为私有并添加一个属性以将该字段公开到类之外。

如果您的类是包含类的纯粹状态,那么您可以考虑将成员直接放在使用它们的类中。如果您的课程不仅仅是状态(我怀疑是),那么它应该遵循通常的可维护性规则。

于 2011-01-02T13:50:32.040 回答
2

我会 - 封装在课堂内外都很有用。通过通过众所周知的接口(即属性)汇集对成员的所有访问,您可以灵活地在以后添加围绕该访问的逻辑,而无需更改调用代码。

这可能看起来有点矫枉过正,但老实说,鉴于自动实现的属性,声明一个属性非常容易,您不妨继续使用它来为自己提供最大的灵活性。

于 2011-01-02T13:51:08.530 回答
1

在我的组织中,当一个类是私有的或内部的,并且它是一个实体类时,我们使用公共字段来访问它。

但是,从 C# 3.0 开始我们使用自动属性,所以我们总是使用属性来访问私有字段。

无论如何,效果是一样的,在我们的例子中是为了让代码更具可读性。

于 2011-01-02T13:51:30.880 回答
0

最佳实践是为其他类型可访问的每个成员使用属性。C# 3.0 中的自动属性使这非常容易。

于 2011-01-02T13:52:40.707 回答
0

一两个星期前,我刚刚阅读了一些关于此的内容。有两个阵营。大多数人说你必须把房子包裹起来,因为我的老师这么说,其他人都这样做。他们说这更容易为属性添加额外的逻辑或更易于维护以及其他一些薄弱的原因。另一个阵营,称自己为“真正的 OO 人”,如果你完全使用属性,你就做错了(当然也有一些例外)。据我所知,你的情况是个例外。实际上,考虑一下,他们可能仍然会说你做错了:) 就是赢不了。无论如何,他们还说如果你要使用它们,除非你需要在你的 setter 和 getter 中使用额外的逻辑,否则不要费心包装。为什么要白白减慢你的程序。(显然他们也可以测量速度有多慢)。

我倾向于在字段上使用属性,因为我做了很多 MVVM 并且需要实现需要它们的 INotifyPropertyChanged。在您的情况下,我不会担心将它们包装在属性中只会导致毫无意义的脂肪。但是,如果它在一个需要属性的类中,那么我会包装它们以在该类中保持相似的东西。

如果毕竟你没有包装它们,并且以后需要,那么如果你有 Resharper,它是一个右键单击 refactor->encapsulate 字段来包装一个属性。

于 2011-01-02T14:29:52.457 回答