自动实现的属性,内部字段名是如何约定的呢?
普通的属性,可以显示声明内部字段,但是对于自动实现的属性,没有显式的声明内部字段,可是内部字段肯定是存在的呀。
对于:
public string Lastname { get; set; }如果要在 get访问器 或是 set访问器 中写代码的话,就要引用“内部字段”名称呀。namespace ui
{
class Class1
{
//下面是普通属性
public string Firstname
{
get { return _Firstname; }
set { _Firstname = value; }
}
private string _Firstname; //下面是自动实现的属性:
public string Lastname { get; set; }
}
}
普通的属性,可以显示声明内部字段,但是对于自动实现的属性,没有显式的声明内部字段,可是内部字段肯定是存在的呀。
对于:
public string Lastname { get; set; }如果要在 get访问器 或是 set访问器 中写代码的话,就要引用“内部字段”名称呀。namespace ui
{
class Class1
{
//下面是普通属性
public string Firstname
{
get { return _Firstname; }
set { _Firstname = value; }
}
private string _Firstname; //下面是自动实现的属性:
public string Lastname { get; set; }
}
}
如果不对 get,set 访问写代码,就不用显式的指定“内部字段名”
如果对属性 Lastname 中的get ,set 访问器写代码,是不是就必须显式的指定“内部字段名”呀?
我的理解对吗 class Class1
{
private string _Firstname;
public string Firstname
{
get { return _Firstname; }
set { _Firstname = value; }
}
//--------------------------------------------------------------------- //如果不对 get,set 访问写代码,就不用显式的指定“内部字段名”
//public string Lastname { get;set }
//如果对属性 Lastname 中的get ,set 访问器写代码,是不是就必须显式的指定“内部字段名”呀?
private string _Lastname;
public string Lastname
{
get { return _Lastname; }
set
{
if (value !="" && value !=null)
{
_Lastname = value;
}
}
} }
class Class1
{
private string _Firstname;
public string Firstname
{
get { return _Firstname; }
set { _Firstname = value; }
}
//--------------------------------------------------------------------- //如果不对 get,set 访问写代码,就不用显式的指定“内部字段名”
//public string Lastname { get;set }
//如果对属性 Lastname 中的get ,set 访问器写代码,是不是就必须显式的指定“内部字段名”呀?
private string _Lastname;
public string Lastname
{
get { return _Lastname; }
set
{
if (value !="" && value !=null)
{
_Lastname = value;
}
}
}
}
我如何引用呢?
以往的写法,如下:private string name; //将敏感字段私有化
public string Name //提供属性,并提供get,set访问器对敏感字段进行赋值或读取
{
get{return name;}
set{name = value;}
}新写法:public string Name{get;set;} //省略了私有字段,并get,set访问器没有实现
这种新的写法可以比旧的方法省去2/3的代码量。
那么,省去的代码到了哪里?
其实,省去了代码并没有省去。
它会在C#编译器将代码编译为MSIL的时候添加上。
可以使用反射工具进行查看。
如果你要在get或set里写代码,就不能用自动实现属性
如果是利用新的写法的话,对于不需要在逻辑上进行判断的字段,就可以省去了。
直接提供属性进行访问或者读取。
比如public string Name{get;set;}
//在对Name赋值或者读取的时候,会自动生成一个_Name变量,读取的操作都是针对他。
//所以私有变量就可以忽略了。
public string Name{get;set;} //省略了私有字段,并get,set访问器没有实现但是如果,我对 set 访问器 写验证代码,就必须要引用内部字段名呀?
关键是,我如何引用呢?是不是,只要需要在 set 访问器中写代码,就必须显式的指定 内部字段名 呢?
如果在 get 或是 set 中写代码就不能使用自动属性这一特性,自动属性只能生成最简单的get/set逻辑
形如
public string Firstname
{
get { return _Firstname; }
set { _Firstname = value; }
}
属性器的访问器逻辑不一定会应用到某个字段
如
public string Firstname
{
get { return "wo"+"cao"; }
}
时刻记住他实质就是方法调用而已
自动属性只会帮你生成最简单的get/set逻辑
形如 private string _Firstname;
public string Firstname
{
get { return _Firstname; }
set { _Firstname = value; }
}
要实现自己的get/set逻辑,不能使用自动属性