C# set與get方法及其好處

爲了更好的隱藏數據成員,將對數據成員的存儲與訪問分離開,避免直接訪問可能造成的錯誤,同時又具備使用數據成員的靈活性,我們用到了屬性。對於屬性的讀寫我們用到set和get。通過set方法來設置屬性,get方法來獲取屬性。

對於屬性的讀寫主要有兩種方式: 
1、使用純方法來訪問屬性。具體代碼如下

class Student
    {
        private string name;
        private uint number;
        public void SetName(string name) 
        {
            this.name = name;
        }
        public void SetNumber(uint number) {
            this.number = number;
        }
        public string GetName() {
            return name;
        }
        public uint GetNumber() {
            return number;
        }
    }
  • 使用:
 class C
    {
        public static void Main(string[] args)
        {
            Student s = new Student();
            s.SetName("Mike");
            s.SetNumber(23);
            Console.WriteLine("student name:{0},number:{1}",s.GetName(),s.GetNumber());
        }
    }

2、使用屬性方式訪問屬性。

使用這種方式需要注意,同一屬性的get和set方法不能夠分開定義。及name屬性的set和get方法都要放在public string Name的屬性定義中,若有兩個public string Name編譯會報錯。編譯器會認爲Student類定義了兩個同名的屬性,一個只讀一個只寫。

 class Student
    {
        private string name;
        private uint number;
        public string Name
        {
            set
            {
                name = value;
            }
            get
            {
                return name;
            }

        }
        public uint Number
        {
            set
            {
                number = value;
            }
            get
            {
                return number;
            }
        }

    }
  • 使用:
  class C
    {
        public static void Main(string[] args)
        {
            Student s = new Student();
            s.Name = "Mike";
            s.Number = 23;
            Console.WriteLine("student name:{0},number:{1}",s.Name,s.Number);
        }
    }

  • 既然外界可以通過set和get訪問類內私有成員,那爲什麼不直接把它定義成共有,直接供外界訪問呢?拿上面的Employee類來說明:

class Employee
    {
        private string name;
        private byte age;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        //****修改後****↓↓↓↓↓↓↓↓
        public byte Age
        {
            get { return age; }  
            set
            {                
                if (value > 10 && value<=100)   //一般在公司僱員的年齡都在10到100歲之間
                age = value;   
            }
        }
        //****修改後****↑↑↑↑↑↑↑↑
    }

上例中,set就像一位門衛大叔一樣,只有好人才能進來。可以通過屬性來控制對員變量的讀寫,防止對成員變量的非法賦值等。

再舉個小例子,以下是個溫度計的類:

class Thermometer
    {
        private double temperature;
        public Thermometer(double temperature)  //構造函數
        {
            this.temperature = temperature;
        }
        public double Temperature
        {
            get { return temperature; }
            set { temperature = value; }
        }
    }

假設這裏的溫度單位表示的是攝氏度(℃),如果在需求分析階段誤解了客戶的原始意願或者客戶在日後變更了需求,需要把系統中所有表示溫度的變量temperature都用來表示開爾文溫度(K)。那麼不必動系統中成百上千個Temperature屬性,只需在get和set函數中稍微修改一下代碼即可:

class Thermometer
    {
        private double temperature;
        public Thermometer(double temperature)  //構造函數
        {
            this.temperature = temperature;
        }
        public double Temperature
        {
            //****修改後****↓↓↓↓↓↓↓↓
            get { return temperature-273.15; }
            set { temperature = value+273.15; }
            //****修改後****↑↑↑↑↑↑↑↑
        }
    }

建一個控制檯應用程序來測試一下,主函數爲:

class Test
    {
        static void Main(string[] args)
        {
            Thermometer a = new Thermometer(40);
            Console.WriteLine(a.Temperature);
        }
    }

上面代碼中用構造函數給溫度設的初值爲40度,代碼修改前運行結果爲“40”,代碼修改後運行結果爲“-233.15”。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章