C#中的GET和SET訪問器


  我們在學習C#語法的屬性時,都要首先和GET,SET訪問器打交道,從英文的字面意思上理解,GET應該就是獲得什么什么,而SET應該是設置什么什么,那我們看一下,官方是怎么定義這對訪問器的:get是讀取屬性時進行的操作,set是設置屬性時進行的操作。定義一個屬性如果只有get,這個屬性就是只讀的。同樣,只有set,屬性就是只寫的,當然只寫的屬性我覺的意義不是很大。

接下來我們通過一些代碼實例來接觸一下GETSET訪問器

class Bank
    {
        private int money;//私有字段

        public int Money  //屬性
        {
            //GET訪問器,可以理解成另類的方法,返回已經被賦了值的私有變量money
            get { return money;  }
            //SET訪問器,將我們打入的值賦給私有變量money
            set { money = value; }
        }
        
    }

我們可以打個生動的比方:

Money屬性就像銀行里的自動存取款機,你看不見里面的money,但你能用set(存錢),用get(取錢)。money是一個私有字段,是分裝在類中的,類以外的程序不能直接訪問的,類的setget成員是外部程序訪問類內部屬性的唯一方法,就像你去銀行取錢,你不能直接從銀行的保險櫃里拿到錢,而是銀行營業人員把錢取出來給你的。
那我們設置了Money屬性,怎么使用呢??

class Program
    {
        static void Main(string[] args)
         {
            //實例化一個Bank銀行
            Bank bank = new Bank();

            //對Money屬性做賦值操作,這時我們訪問的是SET訪問器
            bank.Money = 15;

            //對Money屬性做取值操作,這時我們訪問的是GET訪問器
            int a = bank.Money;
         }
    }

 細心的朋友可以發現當我們設置斷點在SET訪問的中,執行代碼 bank.Money = 15;時,就會進入我們屬性中的SET訪問器了。

 

以上就是我們的SET和GET訪問器的最基本的應用了。

但是我們為什么要用GET和SET訪問器呢??
通過GET和SET對公有變量Money進行讀寫操作,實際就是間接更改money私有變量的值,那既然如此。為何不設money為public,讓實例直接對money進行讀寫操作呢?我們是不是在多此一舉呢?

其實,我當初剛接觸GET和SET就很理解,並不是說他們的含義難理解,而是為什么要用?為何不直接用個public的字段變量來代替呢?

理解一:用了GET和SET能讓賦值和取值增加限制

class Bank
    {
        private int money;//私有字段

        public int Money  //屬性
        {
            //GET訪問器,可以理解成另類的方法,返回已經被賦了值的私有變量money
            get { return money;  }
            //SET訪問器,將我們打入的值賦給私有變量money,並且加了限制,不能存負的
              set
            {
                if (value >= 0)
                {
                    money = value;
                }
                else
                {
                    money = 0; 
                }
            }
        }
        
    }

這樣的話,我們是永遠無法給Money屬性賦值負的金錢了!

其實這種應用才我們的實際的項目中,屬性設置中非常常見!例:

 public string ApplyStaff
        {
            //延遲加載ApplyStaff對象
            get
            {
                if (this.IsGhost)
                {
                    LazyLoaderFactory.GetLoader().LoadApplicationConfirm(this);
                }
                return applyStaff;
            }
            set
            {
                //判斷輸入的字符的長度
                if (value.Length > 40)
                {
                    throw new Exception("領用人不能超過40個字符。");
                }
                this.applyStaff = value;
            }
        }
 public string BillName
        {
            get
            {
                return billName;
            }
            set
            {
                if (value==string.Empty)
                {
                    throw new Exception("單據名稱不能為空");
                }
                else if (value.Length > 40)
                {
                    throw new Exception("單據名稱長度不能超過40個字符");
                }
                else
                {
                    this.billName = value;
                }
            }
        }

如果在SET訪問器中設置這個屬性的一些特性,比如說不能為空,長度大小,必須為數字,各類正則表達式等等,然后拋出異常,表示層再來接受,這樣就可以少寫很多驗證程序了。

理解二:封裝性、安全性、完整性

我也沒想太明白

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM