【发布时间】:2010-10-14 14:35:09
【问题描述】:
如果类中有以下代码,get和set方法是否与变量关联?如何使用类的实例访问 get 和 set?
public string Something { get; set; }
【问题讨论】:
-
不,它被称为自动属性(魔法)
如果类中有以下代码,get和set方法是否与变量关联?如何使用类的实例访问 get 和 set?
public string Something { get; set; }
【问题讨论】:
这本质上是一个编译器技巧。当你编译代码时,编译器会生成一个隐藏字段以及在get和set中返回和设置字段的必要代码。
您可以像访问任何其他属性一样访问此属性。 MyClass.Something = "bla".
【讨论】:
.Net Framework 3.5(自动属性)附带此语法
就像:
private string something;
public string Something
{
get { return something; }
set { something = value; }
}
要访问这个变量(应该在 MyClass 类中):
// GET
MyClass myObj = new MyClass();
string test = myObj.Something;
// SET
myObj.Something = "blabla";
【讨论】:
这是一个自动属性,它会在编译器中创建一个支持字段,您无需为其编写代码。
得到:
var str = instance.Something;
设置:
instance.Something = "new value";
【讨论】:
【讨论】:
编译器会为您创建一个包含 getter 和 setter 方法 (*) 的支持变量,但您不会在标准代码中看到它们。您只需直接访问该属性即可。
myClass.Something = "blah"; // uses set
string myValue = myClass.Something; // uses get;
*这些方法是为属性创建的,而不是它们是否自动实现。在自动实现属性的情况下,编译器生成的支持变量被添加到混合中。
【讨论】:
public string Something;。不同之处在于,对于属性,您可以(明确地)拥有支持变量,您可以在 setter 中进行验证,您可以拥有不同的访问权限get 和 set 的修饰符(所以也许外部代码可以获取该值,但只有类本身可以设置它),或者上面的组合加上我没有提到的其他内容。首选方法是通过属性而不是字段公开数据。
这类似于下面的代码,但击键次数要少得多:-)
public string Something {
get() {
return _Something;
}
set(string value) {
_Something = value;
}
}
【讨论】:
编译器会这样:
public string Something { get; set; }
变成这样的东西(在 IL 中,为方便起见转换为 C#):
string _something;
public string get_Something() { return _something; }
public void set_Something(string value) { _something = value; }
另外,编译器会转换这些行:
Something = "test";
var result = Something;
进入这个:
set_Something("test");
var result = get_Something();
所以你看,下面都是方法调用(就像在 Java 中一样),但在 C# 中拥有属性语法确实是 sweet。但是如果你尝试直接调用这些方法,你会得到一个error。
【讨论】: