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

时间:2014-04-16 07:23:18

标签: c# .net oop

直到现在,我的印象是Properties& Methods是C#中的两个不同的东西。但后来我做了类似下面的事情。

enter image description here

这对我来说是一个“眼睛开启者”。我期待一个属性stringProp和一个方法stringProp,但我得到了这个。

为什么会这样?有人可以解释一下。

4 个答案:

答案 0 :(得分:110)

是的,编译器为属性生成一对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的Why Properties Matter

答案 1 :(得分:24)

严格来说,属性不是方法,尽管它们 确实受到getter和setter方法(也称为访问器)的支持。当您编写这样的代码时(假设您修改代码以删除下面提到的编译错误)

myFoo.stringProp = "bar";

编译器实际上生成如下的IL代码:

ldstr       "bar"
callvirt    foo.set_stringProp

其中set_stringProp是该属性的setter方法。实际上,如果您愿意,可以直接通过反射调用这些方法。

但是,您发布的代码示例在Visual Studio的intellisense中可能看起来不错,但它不会编译。尝试构建项目,您将看到如下错误:

  

'foo'类型已经包含'stringProp'的定义

答案 2 :(得分:18)

这是visual studio intelicence问题,它按名称选择 。顺便说一下,由于同名类型的名称冲突,你的代码甚至无法编译。

但你是对的,最后属性方法:

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(属性)

答案 3 :(得分:-1)

是。属性是mutator方法。

在计算机科学中,mutator方法是一种用于控制变量变化的方法。它们也被广泛称为setter方法。通常,setter附带一个getter(也称为accessor),它返回私有成员变量的值。

mutator方法最常用于面向对象的编程,符合封装原则。根据这个原则,类的成员变量是私有的,以隐藏和保护它们免受其他代码的攻击,并且只能通过公共成员函数(mutator方法)修改,该函数将所需的新值作为参数,可选地验证它,并修改私有成员变量。

Mutator方法也可用于非面向对象的环境中。在这种情况下,对要修改的变量的引用将与新值一起传递给mutator。在这种情况下,编译器不能限制代码绕过mutator方法并直接更改变量。开发人员有责任确保变量仅通过mutator方法修改,而不是直接修改。

在支持它们的编程语言中,属性提供了一种方便的替代方案,而不会放弃封装的实用性。

参考:http://en.wikipedia.org/wiki/Mutator_method