none
關於宣告變數為唯讀和唯寫的好處 RRS feed

  • 問題

  • 範例 1

    看了一些範例和說明後我還是不太清楚,變數設定成唯讀和唯寫的實際用處是什麼?

     

    這個範例示範執行個體、靜態和唯讀屬性;該屬性會接受從鍵盤輸入的員工名稱、以 1 遞增 <tt>NumberOfEmployees</tt>,及顯示員工名稱和編號。

    public class Employee
    {
        public static int NumberOfEmployees;
        private static int counter;
        private string name;
    
        // A read-write instance property:
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    
        // A read-only static property:
        public static int Counter
        {
            get { return counter; }
        }
    
        // A Constructor:
        public Employee()
        {
            // Calculate the employee's number:
            counter = ++counter + NumberOfEmployees;
        }
    }
    
    class TestEmployee
    {
        static void Main()
        {
            Employee.NumberOfEmployees = 100;
            Employee e1 = new Employee();
            e1.Name = "Claude Vige";
    
            System.Console.WriteLine("Employee number: {0}", Employee.Counter);
            System.Console.WriteLine("Employee name: {0}", e1.Name);
        }
    }


    另外,我看不懂那個
    public Employee() { // Calculate the employee's number: counter = ++counter + NumberOfEmployees; }

    這是一個函式吧?那他沒有return傳回值,為何不需要加上void( public void Employee(){} )
    謝謝。
    2011年10月14日 下午 01:14

解答

  • 唯讀或唯寫,通常是用來控制該屬性的存取權限,是否可以被外部所控制。

    舉個例子,假設有一個class是用來作驗證假鈔,在new這個class的時候,你需要給他一疊鈔票,然後呼叫驗證。
    這個class上有個屬性是這一疊鈔票,總共有幾張是假鈔。那這個屬性就可能會開public get; private set;
    不允許外界來決定假鈔的張數。

    就像這樣:

        public class MoneyChecker
        {
            public MoneyChecker(List<Money> money)
            {
                this.Money = money;
            }
    
            public void CheckMoney()
            {
                var fakeCount = this.Money.Where(x => x.IsFake).Count();
                this.FakeMoneyCount = fakeCount;
            }
    
            public int FakeMoneyCount { get; private set; }
    
            private List<Money> Money { get; set; }
        }
    
        public class Money
        {
            public bool IsFake { get; set; }
        }
    


    另外一個例子,假設我們要定義一個值叫做一個月為30天,這個值不允許被改變且需要開放給外界讀取。

        public class Worker
        {
            /// <summary>
            /// 一個月算30天,唯讀,且允許外界讀取
            /// </summary>
            public readonly int workingDay = 30;
    
            //readonly property
            public int WorkingDay
            {
                get
                {
                    return 30;
                }
            }
    
            public decimal SalaryInMonth()
            {
                var result = this.workingDay * this.SalaryPerWorkingDay;
                return result;
            }
    
            private decimal SalaryPerWorkingDay { get; set; }
            public Worker(decimal salaryPerDay)
            {
                this.SalaryPerWorkingDay = salaryPerDay;
            }
        }
    


    透過這樣的存取限制,可以讓你的物件狀態更加穩定,減少出乎預料的問題。

     


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    • 已標示為解答 IAmJoshLin 2011年10月15日 下午 03:03
    2011年10月15日 上午 03:25

所有回覆

  • 1. 有些變數是只准由類別本身的方法去改,或是記錄不同變化 (ex: 訂單處理狀態) 這種不允許外界動它的,就會設成唯讀,唯寫也有相似的理由。

    2. public Employee() 是類別物件的建構式。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    2011年10月14日 下午 01:24
    版主
  • // A read-only static property:
        public static int Counter
        {
            get { return counter; }
        }

     

    這應該是 "唯讀屬性" 吧 ? 變數和屬性是不同的.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年10月14日 下午 03:55
    版主
  • 唯讀或唯寫,通常是用來控制該屬性的存取權限,是否可以被外部所控制。

    舉個例子,假設有一個class是用來作驗證假鈔,在new這個class的時候,你需要給他一疊鈔票,然後呼叫驗證。
    這個class上有個屬性是這一疊鈔票,總共有幾張是假鈔。那這個屬性就可能會開public get; private set;
    不允許外界來決定假鈔的張數。

    就像這樣:

        public class MoneyChecker
        {
            public MoneyChecker(List<Money> money)
            {
                this.Money = money;
            }
    
            public void CheckMoney()
            {
                var fakeCount = this.Money.Where(x => x.IsFake).Count();
                this.FakeMoneyCount = fakeCount;
            }
    
            public int FakeMoneyCount { get; private set; }
    
            private List<Money> Money { get; set; }
        }
    
        public class Money
        {
            public bool IsFake { get; set; }
        }
    


    另外一個例子,假設我們要定義一個值叫做一個月為30天,這個值不允許被改變且需要開放給外界讀取。

        public class Worker
        {
            /// <summary>
            /// 一個月算30天,唯讀,且允許外界讀取
            /// </summary>
            public readonly int workingDay = 30;
    
            //readonly property
            public int WorkingDay
            {
                get
                {
                    return 30;
                }
            }
    
            public decimal SalaryInMonth()
            {
                var result = this.workingDay * this.SalaryPerWorkingDay;
                return result;
            }
    
            private decimal SalaryPerWorkingDay { get; set; }
            public Worker(decimal salaryPerDay)
            {
                this.SalaryPerWorkingDay = salaryPerDay;
            }
        }
    


    透過這樣的存取限制,可以讓你的物件狀態更加穩定,減少出乎預料的問題。

     


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    • 已標示為解答 IAmJoshLin 2011年10月15日 下午 03:03
    2011年10月15日 上午 03:25
  • 那是個建構式,以類別一樣名的一個方法。

    可以看看  http://mysftway.blogspot.com/        關於物件導向的基本概念。

     

    2011年10月15日 上午 05:42