我使用私人类的实例作为供应到stream.beginread操作的状态对象。 (该课程是我的主流阅读/写作课的私人。)

public class MainClass
{
    // ...

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

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

有兴趣知道别人做什么。

有帮助吗?

解决方案

我会 - 封装在班级和课堂外都很有用。通过通过良好的界面(即属性)汇集所有访问会员的访问权限,您可以灵活地在稍后添加该访问的逻辑,而无需更改调用代码。

看起来好像是过度杀伤,但老实说,鉴于自动实现的属性,声明属性是如此容易,以至于您不妨继续使用一个属性来最大程度地提高灵活性。

其他提示

C#语言并不需要它,但是出于可维护性的原因,绝不会直接暴露字段是一个好习惯 - 建议使用属性。

Stylecop SA1401: :fieldsmustbeprivate。

TypName -fieldsmustbeprivate
CheckID -SA1401
类别 - 可维护性规则

原因

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

规则说明

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

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

如何解决违规行为

要解决违反此规则的行为,请将字段私有化并添加一个属性以公开班级之外的字段。

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

在我的组织中,当班级是私人或内部的,并且是实体课程时,我们使用公共领域来访问它。

但是,由于C#3.0我们使用 自动属性, ,因此我们始终使用属性访问私有字段。

无论如何,效果是相同的,在我们的情况下,执行代码更可读。

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

一两个星期前,我刚刚对此进行了一些阅读。有两个营地。大多数人说,您必须在酒店中包裹,因为我的老师是这样说的,其他所有人都这样做。他们说,这更容易添加到属性或更可维护的以及其他一些弱原因。另一个营地称自己为“真正的OO家伙”往往会沿线,如果您使用的属性完全做错了(当然有些例外)。据我所知,您的情况将是例外。实际上,考虑一下,他们可能仍然会说您做错了:)只是无法获胜。无论如何,他们还说,如果您要使用它们,除非您需要固定器和获取器中的额外逻辑,否则不要打扰包装。为什么一无所有地减慢您的程序。 (显然他们也可以衡量的速度)。

我倾向于在字段上使用属性,因为我做了很多MVVM,并且需要实现需要它们的InotifyPropertychanged。在您的情况下,我不必担心将它们包裹在属性中,只是毫无意义的脂肪。但是,如果是在需要属性的班级中,那么我会把它们包裹起来,以使其在该课程中保持相似之处。

如果您没有包装它们,并且需要以后再包装,则是右键单击的重构 - >封装字段,如果您具有重音手机,则可以包裹属性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top