C# 属性和字段 get set

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值