做了一年的asp.net的开发了,最近有一个疑问,在项目中经常用到实体类,每次写get set ,我就有点不理解了,是不是吃多了没事情做,何必不把字段设置成public就行了,下面做了一个实验
class Program
{
static void Main(string[] args)
{
Entity n = new Entity();
n.Name = "houwc1";
Entity2 n2 = new Entity2();
n2.Name = "houwc2";
Entity3 n3 = new Entity3();
n3.Name = "houwc3";
Console.WriteLine(n.Name);
Console.WriteLine(n2.Name);
Console.WriteLine(n3.Name);
Console.ReadKey();
//结果 代码能够正常的运行
//houwc1
//houwc2
//houwc3
}
}
public class Entity
{
public string Name;
public int Age;
}
public class Entity2
{
//这种代码的快捷键是 prop + tab + tab VS 自动创建 get set
public string Name { get;set;}
public int Age { get; set; }
}
public class Entity3
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string age;
public string Age
{
get { return age; }
set { age = value; }
}
}
我用了3种方式去创建实体类的字段,第一种当然是我最喜欢的直接给类的字段加 public 了,然而 第二种,是.net3.5出来的一种语法(大家都叫做程序员你的语法糖),第3种就是我的老大(以前工作在微软)经常用到的一种方式,我个人认为他估计是以前用 .net2.0的时候养成的习惯,其实第二种 方式(C#语法糖) 编译之后的结果也和第3种一样的,这个可以用反编译软件可以看得到,那么在写 Entity3的时候,我发现,name是类的一个字段,用来保存数据的,那么 Name究竟是什么呢,最后我发现一个问题,在n.name的时候 ,点出来的 name 判断是一个字段的图标 ,然而 n3点出来的Name左边确实一个属性的图标(扳手的小图标---属性),Entity2的实例 n2点出来的name也是属性的图标,然而我个人觉得,只要用{}( 前面没有() )的都是属性,名称后面带 () 的就是方法;那么微软为什么要不推荐直接用public,我也去了解了一下,
1 直接用public违背了 C# oop 编程的 封装 ,所有的基类都不希望派生类去直接访问我的数据
2 可以控制数据的范围,属性就相当于保安,要检查一下,比如 如果age赋值为负数
try
{
Entity4 n4 = new Entity4();
n4.Age = -100;
}
catch
{
Console.WriteLine("我抓到了一个脑残");
}
Console.ReadKey();
}
public class Entity4
{
private int age;
public int Age
{
get { return age; }
set {
if(value<0)
{
//抛出异常
throw new Exception("这个值很脑残");
}
else
{
age = value;
}
}
}
}
}
这里给年龄赋一个负的值,显然不合理
3 可以控制只读或者只写 (只用get 或者只用set)
写了这么多,最后什么时候用哪种方式呢,我觉得写哪种都可以,如果你要在赋值或者取值的时候有限定,你可以采用 entity3的方式,第一种我个人一般也不用,我一般用Entity2的这种,也是微软推荐的,至于为什么不用第一种,我也是很无奈,至少我个人觉得第一种和第二种完全没区别。至少微软也没有给一个我们一个很有道理的说法!