C#属性实际上是方法吗?

直到现在,我还是觉得C#中PropertiesMethods是两个不同的东西。 但后来我做了如下的东西。

在这里输入图像说明

这对我来说是一个“开眼界”。 我期待一个属性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