直到现在,我的印象是Properties
& Methods
是C#中的两个不同的东西。但后来我做了类似下面的事情。
这对我来说是一个“眼睛开启者”。我期待一个属性stringProp
和一个方法stringProp
,但我得到了这个。
为什么会这样?有人可以解释一下。
答案 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方法修改,而不是直接修改。
在支持它们的编程语言中,属性提供了一种方便的替代方案,而不会放弃封装的实用性。