• C#中get,set的自我总结



    假设类是一个银行,既能存钱也能取钱.

    private m_money;
    private class bank()
    {
    get { return m_money ;}
    set { m_money = value ;}         
    }


    m_money 就像银行里的自动存取款机,你看不见里面的money,但你能用set(存钱),用get(取钱)。

    m_money是一个私有字段,是分装在类中的,类以外的程序不能直接访问的,类的set 和get成员是外部程序访问类内部属性的唯一方法,就像你去银行取钱,你不能直接从银行的保险柜里拿到钱,而是银行营业人员把钱取出来给你的.

    属性在调用者看来就像一个普通的变量,普通变量怎么用,它就怎么用,但作为类的设计者,你可以利用属性来隐藏你类中的一些字段,使外界只能通过属性来访问你的字段,你可以通过属性来限制外界对你的字段的存取,就利用get,set

    1. 如果你想让用户随意存取你的字段,那么就实现set和get,
    2. 如果只想让用户读取字段,就只实现get,
    3. 若只想让用户写字段就只实现set,


    同时你还可以在set和get中对用户传递来的值进行一些验证工作,以确保你的字段将含有正确的值。

    比如

    private int a;
    public int Index
    {
    get{ return a; }
    set{   if (value>0) a=value;      else   a=0; }
    }


    可以看出,get/set有一种函数的特征。

    • 一则是隐藏组件或类内部的真实成员,
    • 二是用来建立约束的,比如,实现“有我没你”这种约束。
    • 三是用来响应属性变化事件,当属性变化时做某事,只要写在SET 方法里就行了。



    一些加深理解的具体例子:

    1.

    可以将 get 访问器用于返回字段值,或用于计算字段值并将其返回。例如:

    public string Name
    {       
           get    {      return name != null ? name : "NA";   }  
    }

    在上述代码段中,如果不对 Name 属性赋值,它将返回值 NA。

    2.

    class MyClass  
    {  
            protected int num=0;  
            public int Num  
                {  
                set 
                    {  
                    num=value;  
                    }  
                }
    }  
        class MyClassDerived: MyClass  
    {  
            new public int Num  
        {  
                get 
                {  
                    return num;
                }
        }
    }
            class Test
    {
            public static void Main()  
        {
            MyClassDerived MyObject = new MyClassDerived();
            //MyObject.Num= 1; //错误 !  
            ((MyClass)MyObject).Num = 1;
        }
    } 

    3.对所有有必要在类外可见的域,C#推荐采用属性来表达。属性不表示存储位置,这是属性和域的根本性的区别。下面是一个典型的属性设计:

    using System;  
    class MyClass  
    {  
            int integer;  
            public int Integer   
            {  
                get {return integer;}  
                set {integer=value;}  
            }  
    }  
    class Test  
    {  
            public static void Main()  
        {  
        MyClass MyObject=new MyClass();
        Console.Write(MyObject.Integer);
        MyObject.Integer++;
        Console.Write(MyObject.Integer);
        }  
    } 

    4.方便更改需求 如果说有人让你把所有的StrName都加一个"_"的前缀那么如果public string strName;,你用了100个地方,就要改100个地方但是使用属性,你只要改一处就好

    private string strName;
            public string StrName
            {
                get { return "_"+strName; }
                set { strName = value; }
            }



  • 相关阅读:
    PHP文件下载
    win7的IE11降到IE8
    京东电话面试——PHP开发
    PHP异常处理
    php错误处理
    php练习7——类的运用(四则运算or面积计算[javascript小技巧——根据需求显示不同界面])
    php练习6——面向对象编程(打印乘法表)
    SICP阅读笔记(一)
    随笔(2015-18-19)
    MIT scheme入门使用
  • 原文地址:https://www.cnblogs.com/fifa0329/p/4536674.html
Copyright © 2020-2023  润新知