C#属性实际上是方法吗?
直到现在,我还是觉得C#中Properties
& Methods
是两个不同的东西。 但后来我做了如下的东西。
这对我来说是一个“开眼界”。 我期待一个属性stringProp
和一个方法stringProp
,而是我得到了这个。
为何发生这种事? 请有人解释一下。
是的,编译器为一个属性生成一对get和set方法,并为一个自动实现的属性加上一个私有的后台字段。
public int Age {get; set;}
成为相当于:
private int <Age>k__BackingField; public int get_Age() { return <Age>k__BackingField; } public void set_Age(int age) { <Age>k__BackingField = age; }
访问你的属性的代码将被编译来调用这两种方法之一。 这正是公共场所变成公共财产的原因之一,是一个突破性的变化。
见Jon Skeet的“ 为什么属性” 。
严格地说,属性不是方法,尽pipe它们确实得到了getter和setter方法(也称为访问器)的支持。 当你编写这样的代码(只要你修改代码来删除下面提到的编译错误)
myFoo.stringProp = "bar";
编译器实际上生成如下的IL代码:
ldstr "bar" callvirt foo.set_stringProp
其中set_stringProp
是该属性的setter方法。 事实上,如果你愿意,你可以通过reflection直接调用这些方法。
但是,您发布的代码示例在Visual Studio的智能感知中可能看起来不错,但不会编译。 尝试构build项目,你会看到一个错误,如:
types'foo'已经包含'stringProp'的定义,
这是视觉工作室intelicence问题, 按名称挑选。 顺便说一句,你的代码甚至不会编译,因为在相同types的名称冲突。
但是你是对的,那些属性是最后的方法:
public class A { public string Name {get;set;} }
这里Name
属性被转换成2个方法: get_Name()
和set_Name()
。
事实上,如果你这样定义类:
public class A { public string Name {get;set;} public string get_Name() { return "aaa"; } }
你会得到编译错误,因为已经定义了get_Name
(property)
是。 属性是mutator
方法。
在计算机科学中,增变器方法是一种用来控制variables变化的方法。 他们也被广泛的称为setter方法。 一个setter通常伴随着一个getter(也称为访问器),它返回私有成员variables的值。
mutator方法最常用于面向对象的编程,符合封装原则。 根据这个原则,一个类的成员variables是隐藏的,并且保护它们不受其他代码的影响,并且只能被一个公共成员函数(mutator方法)修改,该函数将所需的新值作为参数,可选地validation它,并修改私有成员variables。
Mutator方法也可以用在非面向对象的环境中。 在这种情况下,对要修改的variables的引用将与新值一起传递给增变器。 在这种情况下,编译器不能限制代码绕过mutator方法并直接更改variables。 这个责任落在了开发者的头上,以确保variables只能通过mutator方法修改,而不能直接修改。
在支持它们的编程语言中,属性提供了一个方便的select,而不会放弃封装的效用。
参考: http : //en.wikipedia.org/wiki/Mutator_method