激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - .NET基礎之自定義泛型分析

.NET基礎之自定義泛型分析

2019-12-12 12:10shichen2014 ASP.NET教程

這篇文章主要介紹了.NET基礎之自定義泛型,實例分析了定義泛型類、default關鍵字、約束類型等的用法,具有一定的參考借鑒價值,需要的朋友可以參考下

本文實例分析了.NET基礎之自定義泛型。分享給大家供大家參考。具體分析如下:

在.NET中泛型使用非常頻繁,在控制臺應用程序中,默認的引入了System.Collection.Generics名稱空間,其中就提供了我們經常使用的泛型:List<T>和Dictionary<T>,相信用過它們的都知道它們的強大。還有一種我們經常使用的簡單的泛型:System.Nullable<T>,即可空類型。我們可以:
 
System.Nullable<int> nullableInt;
聲明一個可空的int類型,由于C#語法對這個做了簡化通常我們都不這樣寫,而是這樣寫:
 
int? nullableInt
下面重點介紹一下如何自定義泛型。
 
定義泛型類
 
創建泛型類是需要在類定義中用尖括號語法:

復制代碼代碼如下:
class MyGenericClass<T>
{
    ...
}


T可以是任意的標示符,只要遵守命名規則即可。

 

可以把類型用在類成員的返回類型,方法參數類型等,例如:

復制代碼代碼如下:
class MyGenericClass<T1, T2, T3>
{
    private T1 t1Object;
 
    public MyGenericClass(T1 item)
    {
        t1Object = item;
    }
 
    public T1 T1Object
    {
        get
        {
            return t1Object;
        }
    }
}

 

注意如果不能假定提供了什么類型。下面的代碼不能執行:

復制代碼代碼如下:
class MyGenericClass<T1, T2, T3>
{
    private T1 t1Object;
 
    public MyGenericClass()
    {
        t1Object = new T1();
    }
}

 

因為我們不知道T1是否有公有的默認構造函數。

default關鍵字
 
如果我們定義了一個泛型的字段,我們想在構造函數中初始化它,但是我們不知道它的引用類型還是值類型,那么default就派上用處了:

復制代碼代碼如下:
public MyGenericClass()
{
    t1Object = default(T1);
}


如果是值類型就賦值0,引用類型就賦值null。

 

約束類型
 
在定義泛型的時候我們可以對類型進行約束,通過where關鍵字實現:

復制代碼代碼如下:
class MyGenericClass<T1> where T : constraint1,constraint
{
    ...
}


constraint定義了約束,多個約束用逗號隔開,如果有多個類型:

復制代碼代碼如下:
class MyGenericClass<T1, T2> where T1 : constraint1 where T2 : constraint
{
    ...
}


下面給出一些可用的約束
 
                                        約束                                                                  說明
 
                                where T:struct                                     使用結構約束,類型T必須是值類型
 
                                where T:calss                                       類約束指定,類型T必須是引用類型
 
                                where T:interface                                  指定類型T必須實現是接口或者實現了接口
 
                                where T:base-class                               指定類型T必須是基類或者派生于基類
 
                               where T:new()                                       指定類型T必須有一個默認構造函數
 
 
 
下面結合以上知識給個實例:(PS不要看到代碼多 其實很簡單的 耐心看下去)
 
先定義四個類Animal、Cow 、Chicken和SuperCow

復制代碼代碼如下:

#region Animal 虛基類 有一個name屬性 Feed方法和一個虛方法MakeANoise
//虛基類 有一個name屬性 Feed方法和一個虛方法MakeANoise
public abstract class Animal
{
        protected string name;
 
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
 
        public Animal()
        {
            name = "The animal with no name";
        }
 
        public Animal(string newName)
        {
            name = newName;
        }
 
        public void Feed()
        {
            Console.WriteLine("{0} has been fed.", name);
        }
 
        public abstract void MakeANoise();
}
#endregion

 

//Cow Animal的子類,實現虛方法
public class Cow:Animal
{
        public Cow(string name) :
            base(name)
        {
        }
        public override void MakeANoise()
        {
            Console.WriteLine("{0} says 'moo!'", name);
        }
}

//Chicken類,Animal子類
public class Chicken:Animal
{
        public Chicken(string name)
            : base(name)
        { }
        public override void MakeANoise()
        {
            Console.WriteLine("{0} says 'cluck'", name);
        }
}

//Cow的子類,有一個自己的方法Fly
class SuperCow : Cow
{
        public SuperCow(string name) : base(name) 
        {
        }
 
        public void Fly()
        {
            Console.WriteLine("{0} is flying!", name);
        }
 
        public override void MakeANoise()
        {
            Console.WriteLine("{0} says 'I am supercow!'", name);
        }
}

 

類準備好了之后,我們可以開始定義我們的泛型了:

復制代碼代碼如下:
//繼承了迭代器接口,這樣方便使用Foreach 約束它的類型為Animal及其子類
public class Farm<T>:IEnumerable<T> where T : Animal
{
        private List<T> animals = new List<T>();
 
        public List<T> Animals
        {
            get 
            {
                return animals;    
            }
        }
        //迭代器
        public IEnumerator<T> GetEnumerator()
        {
            return animals.GetEnumerator();
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return animals.GetEnumerator();
        }
 
        //執行所有animal的MakeANoise()
        public void MakeNoises()
        {
            foreach (T animal in animals)
            {
                animal.MakeANoise();
            }
        }
        //執行所有animal的Feed()
        public void FeedTheAnimals()
        {
            foreach (T animal in animals)
            {
                animal.Feed();
            }
        }
        //獲得animals中的cow
        public Farm<Cow> GetCows()
        {
            Farm<Cow> cowFarm = new Farm<Cow>();
            foreach (T animal in animals)
            {
                if (animal is Cow)
                {
                    cowFarm.Animals.Add(animal as Cow);
                }
            }
            return cowFarm;
        }
}

 

泛型定義好了,我們用寫代碼來調用它:

復制代碼代碼如下:
class Program
{
        static void Main(string[] args)
        {
            Farm<Animal> farm = new Farm<Animal>();
            farm.Animals.Add(new Cow("Jack"));
            farm.Animals.Add(new Chicken("Vera"));
            farm.Animals.Add(new Chicken("Sally"));
            farm.Animals.Add(new SuperCow("Kevin"));
            farm.MakeNoises();
 
            Farm<Cow> dairyFarm = farm.GetCows();
            dairyFarm.FeedTheAnimals();
 
            foreach (Cow cow in dairyFarm)
            {
                if (cow is SuperCow)
                {
                    (cow as SuperCow).Fly();
                }
            }
            Console.ReadKey();
        }
}

 

希望本文所述對大家的.net程序設計有所幫助。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产无区一区二区三麻豆 | 亚洲激情91 | 鲁丝片一区二区三区免费入口 | av免费在线网站 | 97超碰资源站 | 草久影视 | 欧美国产日韩在线观看成人 | 在线天堂中文字幕 | 在线观看国产日韩 | 中国大陆高清aⅴ毛片 | 日韩精品中文字幕一区 | 久久老司机| 成人一级毛片 | 91免费影片| 日本欧美一区二区 | 毛片电影在线看 | 91精品国产综合久久男男 | av观看国产 | 永久av在线免费观看 | 欧美日韩成人一区二区 | 亚洲草逼视频 | 国产无限资源在线观看 | 日本一级黄色毛片 | 欧美精品一区自拍a毛片在线视频 | 成人毛片av在线 | 91精品国产九九九久久久亚洲 | 精品成人av一区二区在线播放 | 欧美精品一区二区三区久久久 | 少妇av片| 九九午夜| 久久不射电影网 | 一级免费在线视频 | 日本中文字幕高清 | 欧美一级视频免费看 | 中国毛片在线观看 | 成年免费网站 | 亚洲国产精品一区二区久久 | 欧美性生活视频免费 | 国产一级91 | 鲁丝一区二区二区四区 | 亚洲一区 国产精品 |