现在,如果您阅读MSDN for C#中的命名约定,您会注意到它声明属性始终优先于public和protected字段.有些人甚至告诉我,你永远不应该使用公共或受保护的领域.现在我同意我还没有找到一个理由
我可以看到它,如果您需要确保在获取/设置值时执行某些验证检查,但是在我看来,很多时候它似乎只是额外的开销.我的意思是说我有一个类GameItem,其中包含baseName,prefixName和suffixName的字段.为什么我要承担创建属性(C#)或访问器方法的开销以及我会发生的性能损失(如果我对应用程序中的每个字段执行此操作,我相信它会稍微增加一点点,特别是在某些语言如PHP或某些具有性能的应用程序如游戏一样至关重要?
Are protected members/fields really that bad?
不,他们的方式更糟糕了.
只要成员比私有更容易访问,您就可以向其他类保证该成员的行为方式.由于一个字段是完全不受控制的,因此将它“放在野外”会打开你的类和类,这些类和类会从你的类中继承或与之交互,从而导致更高的bug风险.没有办法知道一个字段何时发生变化,无法控制改变它的人或者是什么.
如果现在,或者在将来的某个时刻,您的任何代码都依赖于字段某些特定值,您现在必须添加有效性检查和回退逻辑,以防它不是预期值 – 您使用它的每个地方.当你只是把它变成一个该死的财产时,这是一大笔浪费的努力;)
与派生类共享信息的最佳方法是只读属性:
protected object MyProperty { get; }
如果你绝对必须让它读/写,不要.如果你真的,真的必须让它读写,重新考虑你的设计.如果您仍然需要它进行读写,请向同事道歉并且不要再这样做:)
许多开发人员相信 – 并且会告诉你 – 这是非常严格的.而且你可以在没有这么严格的情况下完成任务.但是采用这种方法可以帮助您从刚刚过去到非常强大的软件.你将花费更少的时间来修复bug.
关于对性能的任何担忧 – 不要.我保证在你的整个职业生涯中,你永远不会编写如此快速的代码,以至于瓶颈就是调用堆栈本身.