在最近的一次C#和WPF中,我喜欢C#的属性:
public double length_inches { get { return length_metres * 39.0; } set { length_metres = value/39.0; } }
当然,注意到length_metres可能会从字段变为属性,而代码无需关心.WPF还可以非常愉快地将UI元素绑定到对象属性.
当我第一次学习类和对象时,我认为有一种方法可以做到,因为它看起来很明显!隐藏类中复杂性的关键在于您不再需要关心存储的内容.但直到现在才看到它.
有趣的是,我第一次看到它在VB.Net中完成.OO纯度的前沿.
问题是,我可以重新使用我经常使用的其他语言的属性,比如javascript,python,php吗?在javascript中,如果我将一个变量设置为一个闭包,我不会再次获得闭包,而不是它的结果吗?
Python绝对支持属性:
class Foo(object): def get_length_inches(self): return self.length_meters * 39.0 def set_length_inches(self, val): self.length_meters = val/39.0 length_inches = property(get_length_inches, set_length_inches)
从Python 2.5开始,只读属性存在语法糖,2.6中也存在可写糖:
class Foo(object): # 2.5 or later @property def length_inches(self): return self.length_meters * 39.0 # 2.6 or later @length_inches.setter def length_inches(self, val): self.length_meters = val/39.0
在JavaScript中:
var object = { // .. other property definitions ... get length_inches(){ return this.length_metres * 39.0; }, set length_inches(value){ this.length_metres = value/39.0; } };
在C#中,属性主要只是一个编译器功能.编译器生成特殊方法get_PropertyName
并set_PropertyName
计算调用等.它还设置specialname
了方法的IL属性.
如果您选择的语言支持某种类型的预处理器,您可以实现类似的功能,但除此之外您几乎完全坚持使用的功能.
当然,如果您正在实现自己的.NET语言,那么您也可以执行C#编译器所做的事情.
由于实现细节,字段和属性之间实际上存在细微差别.有关详情,请参阅此问题.