您的位置:首页 > 编程语言 > C#

C# 属性和字段 get set

2015-07-22 16:24 561 查看
做了一年的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的这种,也是微软推荐的,至于为什么不用第一种,我也是很无奈,至少我个人觉得第一种和第二种完全没区别。至少微软也没有给一个我们一个很有道理的说法!


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: