这种写法在.net 2.0后才出现的,目的是为了减轻程序员的工作量,编译器会自动为你补充完整,如:
public string name{get;set;}
编译器自动生成(可能会更负责更完善):
private string name;
public string Name
{
get { return name; }
set { name= value; }
}
这种写法在一般时候很好,但是有一种情况你不得不放弃这种写法,那就是你要在里面进行校验的时候,比如set中有运算或者校验之类的,get中有转换等等,这种情况下,你就必须老老实实的写个完整的才可以。
先回答你的疑问
假如成员变量有a,b两个,属性名是Name,编译器如何知道我想对应a,还是b?
编译器是不可能把Name对应到a或者b这两个的任何一个
如果你想让编译器对应a
那么你的代码应该是
Public string A{get;set;}
b是一样的道理
至于为什么要写成{get;set;} 是因为这样写开发速度显然要比加上return要高
而且这样写与加上return那样写达到的效果是一样的
如果你对达到的效果一样有疑问的话你可以用反编译器查看这两种生成的代码
使用第一种
private string name;
public string Name
{
get { return name; }
set { name= value; }
}
与使用第二种
public string Name{get;set ;}
最后编译器都生成一种代码就是:
private string _name;
public string Name
{
get { return _name; }
set { _name= value; }
}
如有疑问请追问
class Class1
{
public string Arg{get;set;}
}
这种写法是简写形式,当用编译器编译时,编译器会自动补足所需代码:
class Class1
{
private string _Arg;//这个变量是由编译器随机生成的,不一定是_Arg这个名字
public string Arg{get{return _Arg;}set{_Arg=value;}}
}
这个是自动属性,简化属性写法,编译器会为你补足具体的代码。
public string Name{get;set;}
等价于
private string name;
public string Name{get{return name;}set{name=value;}}
你的想法是正确的,但是没人说一个get,一个set就是完整的写法了啊。。。它被省略了而已,举个例子
class xxxx
{
private int a;
public int _a
{
get { return a; }
set { a = value; }
}
}
明白?