程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#特性之數據類型,

C#特性之數據類型,

編輯:C#入門知識

C#特性之數據類型,


這篇文章主要通過演示類在不同發展中的不通過定義方法,來向讀者表述它們之間的區別和聯系。

在C#1時代,我們喜歡這樣定義類:

public class Product
    {
        private string _name;
        public string Name {
            get { return _name; }
        }

        private decimal _price;
        public decimal Price
        {
            get { return _price; }
        }

        public Product(string name, decimal price)
        {
            this._name = name;
            this._price = price;
        }

        public static ArrayList GetArrayList()
        {
            ArrayList list = new ArrayList();
            list.Add(new Product("WindowsPhone", 10m));
            list.Add(new Product("Apple", 10m));
            list.Add(new Product("Android", 10m));

            return list;
        }

        public override string ToString()
        {
            return String.Format("{0}--{1}", _name, _price);
        }
    }

局限性:
1、ArrayList沒有提供與其內部內容有關的編譯時信息,如果不慎寫錯,編譯器也不會出現任何提示;

2、代碼中為屬性提供了公共的取值方法,這意味著如果添加對應的賦值方法,那麼賦值方法必須是共有的;

3、用於創建屬性和變量的代碼很復雜,這違背了我們進行封裝的原本意願;

 

在C#2時代,我們喜歡這樣定義類:

public class Product
    {
        private string _name;
        public string Name {
            get { return _name; }
            private set { _name = value; }
        }

        private decimal _price;
        public decimal Price
        {
            get { return _price; }
            private set { _price = value; }
        }

        public Product(string name, decimal price)
        {
            Name = name;
            Price = price;
        }

        public static List<Product> GetArrayList()
        {
            List<Product> list = new List<Product>();
            list.Add(new Product("WindowsPhone", 10m));
            list.Add(new Product("Apple", 10m));
            list.Add(new Product("Android", 10m));

            return list;
        }

        public override string ToString()
        {
            return String.Format("{0}--{1}", Name, Price);
        }
    }

現在,屬性擁有了私有的賦值方法,並且它能非常聰明的“猜出”List<Product>是告知編譯器列表中只能包含Product。試圖將一個不同類型添加到列表中會造成編譯時錯誤,並且當你從列表中獲取結果時,也並不需要轉化結果的類型;有效的解決了C#1中的前兩個問題;

在C#3時代,我們喜歡這樣定義類:

public class Product
    {
        public string Name
        {
            get; private set;
        }

        public decimal Price
        {
            get; private set;
        }

        public Product(){}

        public static List<Product> GetArrayList()
        {
            return new List<Product>()
            {
                new Product {Name = "WindowsPhone", Price = 10m},
                new Product {Name = "Apple", Price = 10m},
                new Product {Name = "Android", Price = 10m}
            };
        }

        public override string ToString()
        {
            return String.Format("{0}--{1}", Name, Price);
        }
    }

發展到這個階段,我們可以很明顯的發現,不再有任何代碼(或者可見的變量)與屬性關聯,而且硬編碼的列表是以一種全然不同的方式構建,這樣一來,我們實際上是完全可以刪除就有的構造函數,但是外部代碼就不能再創建其他的產品實例。自動熟悉大大簡化了操作;

在C#4時代,我們喜歡這樣定義類:

public class Product
    {
        private readonly string _name;

        public string Name
        {
            get { return _name; }
        }

        private readonly decimal _price;

        public decimal Price
        {
            get { return _price; }
        }

        public Product(string name,decimal price)
        {
            this._name = name;
            this._price = price;
        }

        public static List<Product> GetArrayList()
        {
            return new List<Product>()
            {
                new Product(name: "WindowsPhone", price: 10m),
                new Product(name: "Apple", price: 10m),
                new Product(name: "Android", price: 10m)
            };
        }

        public override string ToString()
        {
            return String.Format("{0}--{1}", Name, Price);
        }
    }

在這個特定的示例中,C#4的特性的好處還不是很明顯,但當方法或構造函數包含多個參數時,它可以是代碼的含義更加清-特別是當參數類型相同,或某個參數為null時。當然,你可以選擇什麼時候使用該特性,只在是代碼更好的理解時才指定參數的名稱;

總結:

C#1(只讀屬性,弱類型集合)------》C#2(私有屬性賦值方法,強類型集合)------》C#3(自動實現的熟悉,增強的集合和對象初始化)------》C#4(用命名實參更清晰的調用構造函數和方法)

 

注:由於C#5在這方面的特性表現的沒有太大變化,所以就不再表述。

如果你覺得這篇文章對你有所幫助,歡迎轉載,但請注明出處!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved