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

yog*_*ogi 77 .net c# oop

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

在此输入图像描述

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

为什么会这样?请有人解释一下.

dca*_*tro 113

是的,编译器为属性生成一对get和set方法,并为自动实现的属性生成私有支持字段.

public int Age {get; set;}
Run Code Online (Sandbox Code Playgroud)

成为相当于:

private int <Age>k__BackingField;

public int get_Age()
{
     return <Age>k__BackingField;
}

public void set_Age(int age)
{
    <Age>k__BackingField = age;
}
Run Code Online (Sandbox Code Playgroud)

访问您的属性的代码将被编译为调用这两种方法之一.这正是为什么将公共领域变为公共财产是一个突破性变化的原因之一.

请参阅Jon Skeet的" 为什么属性重要".

  • @ dc7a9163d9实际上,`<Age> k__BackingField`是该字段的名称.即使这是C#中的非法名称,它也是IL(中级语言)中完全有效的名称.这是为声明该字段而生成的IL:`.field private int32'<Age> k__BackingField'`.大多数编译器生成的类型,例如lambda闭包和枚举器在其名称中包含`<>`. (30认同)
  • 奇怪的是,代码中的`<Age>`是什么? (11认同)

p.s*_*w.g 24

严格地说,属性不是方法,虽然他们确实由getter和setter方法(也称为存取)的支持.当您编写这样的代码时(假设您修改代码以删除下面提到的编译错误)

myFoo.stringProp = "bar";
Run Code Online (Sandbox Code Playgroud)

编译器实际生成IL代码,如下所示:

ldstr       "bar"
callvirt    foo.set_stringProp
Run Code Online (Sandbox Code Playgroud)

set_stringProp该属性的setter方法在哪里.实际上,如果您愿意,可以直接通过反射调用这些方法.

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

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

  • 最大的区别是属性可以通过可能不适用于方法的属性来获得额外的关联元数据. (2认同)

Tig*_*ran 18

这是视觉工作室的内容问题,可以通过名字选择.顺便说一句,由于同一类型的名称冲突,您的代码甚至无法编译.

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

public class A {

   public string Name  {get;set;}  
}
Run Code Online (Sandbox Code Playgroud)

这里的Name属性转换为2种方法:get_Name()set_Name().

实际上,如果你定义这样的类:

public class A {

   public string Name  {get;set;}  

   public string get_Name() {
       return "aaa"; 
   }
}
Run Code Online (Sandbox Code Playgroud)

你会得到编译错误,因为已经定义了get_Name(属性)