C# 属性和字段 get set
2015-07-22 16:24
561 查看
做了一年的asp.net的开发了,最近有一个疑问,在项目中经常用到实体类,每次写get set ,我就有点不理解了,是不是吃多了没事情做,何必不把字段设置成public就行了,下面做了一个实验
我用了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赋值为负数
这里给年龄赋一个负的值,显然不合理
3 可以控制只读或者只写 (只用get 或者只用set)
写了这么多,最后什么时候用哪种方式呢,我觉得写哪种都可以,如果你要在赋值或者取值的时候有限定,你可以采用 entity3的方式,第一种我个人一般也不用,我一般用Entity2的这种,也是微软推荐的,至于为什么不用第一种,我也是很无奈,至少我个人觉得第一种和第二种完全没区别。至少微软也没有给一个我们一个很有道理的说法!
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的这种,也是微软推荐的,至于为什么不用第一种,我也是很无奈,至少我个人觉得第一种和第二种完全没区别。至少微软也没有给一个我们一个很有道理的说法!
相关文章推荐
- 大白话系列之C#委托与事件讲解(一)
- C# 创建EXCEL文件
- .Net学习笔记----2015-07-22(C#基础复习10,面向对象2个小练习)
- 编写高质量代码改善C#程序的157个建议——导航开篇
- C# 异常类 Exception 枚举所有类型的异常
- C#委托和事件的实例讲解
- C#+Socket客户端断线重连的解决办法
- C#操作IIS
- C#中Array类的使用
- C#中Array类的使用
- C#在窗体中点击任意位置鼠标左键获得该点坐标
- 比较核心的技术了 虚拟ip的一种实现方式(手工添加和C#添加)
- C# 字符串格式
- hihoCoder 字符消除
- c#中实现按钮弹出另一个windows窗口
- C# Array类的浅复制Clone()与Copy()的区别
- C# Array类的浅复制Clone()与Copy()的区别
- C#学习视频分享与开发技术QQ交流群
- C#获取当前程序运行路径的方法集合
- .Net学习笔记----2015-07-22(C#基础复习09,虚方法、抽象方法、接口复习)