直到现在,我的印象是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的" 为什么属性重要".
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'的定义
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
(属性)