我有一个代码段:
public class MyClass
{
private string _myProperty;
public string MyProperty
{
get
{
return _myProperty;
}
set
{
_myProperty = value;
}
}
}
这有什么意义?我本可以将 _myProperty
字符串声明为public,并且我的任何类对象都可以直接访问它们并获取或设置值 .
相反,我们正在使用类对象使用 _myProperty
private并使用get和set来访问它们 .
在任何一种情况下,类对象都能够访问它们,结果总是相同的 .
那么为什么要用这种方法?这只是因为我可以在setter中实现一些约束吗?
除此之外会对成员变量造成什么危害呢?在这个例子中,我可以将 _myProperty
公开为公开,而不是像OOP所暗示的那样仅将它限制为此类而将其限制为私有 .
5 回答
不,结果并不总是一样的 .
尝试绑定到公共字段(或执行任何其他使用反射和期望属性的字段)
尝试通过引用传递属性(不能)
稍后尝试决定是否要记录日志等,并发现当您将其更改为属性时,会丢失源和二进制兼容性 .
前一段时间阅读article I wrote on this
请注意,从C#2开始,您的代码可以缩短很多:
字段
_myProperty
是一个实现细节 - 它告诉编译器您需要一些字符串引用存储并为其指定名称 . get / set方法是对象属性的一部分,它实现了MyProperty
属性 . 因此,如果您想要更改字符串的存储/检索方式,第三方依赖者不必重新编译 .您还可以使用自动属性为您执行此操作:
如果您只是将变量声明为Public,则这些实际上不是Properies . 许多使用反射的功能都不起作用,特别是DataBinding,Serialization等 .
偶尔我会变得懒惰并且这样做,特别是在VB.Net pre v4中工作时,因为没有自动属性,并且总是后悔并返回正确编写属性 .
如果您的类要被非自己的开发人员编写的代码使用,那么使用属性尤为重要,因为他们可能会遇到因不编码完整属性而产生的限制问题 .
正如你所说,属性的主要原因是验证 . 每个 class 都有责任保证他们的成员安全,_myProperty是MyClass的成员 . .Net实现这一责任的方式是有道理的 . 在Java中,您必须定义两个方法:SetMyPropety和GetMyProperty .
重要的是要注意,尽管类通常有助于在属性中包装字段,但对于结构来说这通常会适得其反 . 关于结构使用的许多建议限制源于假设所有结构域都将包含在属性中 . 如果struct的语义提供:
其状态完全由固定数量的参数定义,所有这些参数都公开公开以供阅读 .
这些参数可以自由分配任何对其各自类型合法的值组合 .
结构的默认实例被指定为将所有参数初始化为其各自类型的默认值 .
然后暴露字段会暴露数据类型的"inner workings",但是这种曝光不会排除对数据类型的任何有意义的未来更改,这些更改尚未被规范排除 . 存储在可修改位置的所有结构的所有字段总是暴露出来进行变异,即使唯一的变异方法是从一个实例到另一个实例的所有公共和私有字段的批量副本 . 如果结构的语义要求代码能够创建一个实例,其定义参数具有值的任意组合,而没有限制,那么公开struct 's fields directly won' t允许单线程代码执行任何它无法做到的事情 . 是:
执行得更快
更清楚地表达其意图
已经在多线程场景中定义了语义,否则语义会变得模糊不清
我并不认为要求类型的消费者运行速度较慢,写得笨拙,并且具有模糊的多线程语义 .
请注意,如果有一个策略反对使用具有变异'this'的属性的结构,而不是封装所有结构字段的策略,那么声明如下:
即使语言允许在只读结构上调用属性设置器,也会被拒绝(假设目的是为了像
这将被理解为访问
myArraySegment
持有引用的数组 .