C# 属性和字段 get set

来源:互联网 发布:立项依据怎么写 知乎 编辑:程序博客网 时间:2024/04/27 03:43

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


0 0
原创粉丝点击