亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c# in depth的泛型實現實例代碼

2020-01-24 03:04:39
字體:
來源:轉載
供稿:網友

1.默認值表達式
如果已經明確了要處理的類型,也就知道了它的“默認”值。不知道要引用的類型,就不能直接指定默認值。不能使用null,因為它可能不是一個引用類型,不能使用0,因為它可能不是數值類型。雖然很少需要用到默認值,但它偶爾還是有用的。Dictionary<TKey,TValue>就是一個好的例子,它有個TryValue方法,它的作用有點兒像對數值類型進行處理的TryParse方法:他用一個輸出參數來接收你打算獲取的值,用一個Boolean返回值顯示它是否成功。這意味著方法必須用TValue類型的值來填充輸出參數。請記住,輸出參數必須在方法正常返回之前賦值。
為了滿足這方面的要求,c#2提供了默認值表達式。雖然c#語言規范沒有說他是一個操作符,但可以把它看做是與typeof相似的操作符,只是返回值不一樣罷了。

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 默認值表達式
{
    class Program
    {
        static int CompareToDefault<T>(T value)
        where T : IComparable<T>
        {
            return value.CompareTo(default(T));
        }

        static void Main(string[] args)
        {
            Console.WriteLine(CompareToDefault("x"));
            Console.WriteLine(CompareToDefault(10));
            Console.WriteLine(CompareToDefault(0));
            Console.WriteLine(CompareToDefault(-10));
            Console.WriteLine(CompareToDefault(DateTime.MinValue));
        }
    }
}

運行結果:

在上述代碼中,我們為泛型方法使用了3種不同的類型:string,int和DateTime. CompareToDefault方法規定只能使用實現了IComparable<T>接口的類型作為參數,這樣才能為傳入的值調用ComparTo<T>.傳入的值要和類型的默認值進行比較。string是引用類型,默認值是null―根據有關CompareTo的文檔,所有引用類型的值都要大于null,所以第一個輸出的結果是1,隨后三行和int的默認值進行比較,顯示int的默認值是0.最后一行輸出0,顯示了DateTime.MinValue就是DateTime的默認值。
如果傳遞的參數是null,上述代碼會拋出NullReferenceException異常。

2.直接比較

雖然上述代碼演示了如何進行比較,但我們并不是總是愿意限制我們自己的類型來實現IComparable<T>或者它的姊妹接口IEquatable<T>,后者提供了一個強類型的Equals(T)方法,以彌補所有類型都具備的Equals(object)的不足。如果沒有接口允許我們訪問一些額外的信息,那么我們能做的事情就很少了。只能調用Equals(object)。如果要比較的值時值類型,它會造成裝箱。
如果一個類型是未約束的,就可以使用==和!=操作符,但只能將該類型的值與null進行比較。不能直接比較兩個T類型的值(會報錯,無法通過編譯),如果類型實參是一個引用類型,會進行正常的引用比較。如果為T提供的類型實參是一個非可空值類型,與null進行比較總是不相等(這樣一來,JIT編譯器就可以移除這個比較)。如果類型實參是可空值類型,那么就會自然而然的與類型的空值進行比較。
如果一個類型參數被約束成值類型,就完全不能使用==和!=。如果被約束成引用類型,那么具體執行的比較將完全取決于類型參數被約束成什么類型。如果它只是一個引用類型,那么執行的是簡單的引用比較。如果被進一步約束成繼承自某個重載了==和!=操作符的特定類型,就會使用重載運算符。但要注意,假如調用者指定的類型實參恰巧也進行了重載,那么這個重載操作符是不會使用的。

復制代碼 代碼如下:

using System.Text;
using System.Threading.Tasks;

namespace 直接比較實現
{
    class Program
    {
        static bool AreReferencesEqual<T>(T first, T second)
            where T:class
        {
            return first == second;
        }
        static void Main(string[] args)
        {
            string name = "Joy";
            string intro1 = "My name is "+name;
            string intro2 = "My name is "+name;
            Console.WriteLine(intro1==intro2);
            Console.WriteLine(AreReferencesEqual(intro1,intro2));
        }
    }
}

運行結果為:


雖然string 重載了==,但在執行的比較中是不會用這個重載的。基本上,在說編譯AreReferencesEqual<T>時,編譯器根本不知道有哪些重載可用,就好比傳入的只是object類型的參數。
并非只有操作符才有這個問題,遇到泛型類型時,編譯器會在編譯未綁定時就解析好所有方法重載,而不是等到執行時,才去為每個可能的方法調用重新考慮是否存在更具體的重載。例如,Console.WriteLine(default(t));這個語句總是被解析成Console.WriteLine(object object),即使為T傳遞的類型恰好就是string,也不會調用Console.WriteLine(string value),這好比普通方法重載是發生在編譯時,而不是執行時。
需要對值進行比較時,有兩個相當有用的類,他們是EqualityComparer<T>和Comparer<T>,兩者都位于System.Collection.Generic命名空間中。他們分別實現了IEqualityComparer<T>(適合對字典進行比較和哈希處理)和IComparer<T>(適合排序)。這兩個類的Default屬性能返回一個實現,能為特點的類型采取正確的比較操作。
說明:泛型比較接口  共有四個主要的泛型接口可用于比較。IComparer<T>和IComparable<T>用于排序(判斷某個值是小于、等于還是大于另一個值),而IEqualityComparer<T>和IEquatable<T>通過某種標準來比較兩個項的相等性,或查找某個項的散列(通過相等性方式匹配)
如果換一種方式來劃分這四個接口,IComparer<T>和IEqualiyComparer<T>的實例能比較兩個不同的值,而IComparer<T>和IEquatable<T>的實例則可以比較它們本身和其他值。

3.一個完整的比較實例,表示一對值

這是一個完整的實例,它實現了一個有用的泛型類型,也就是一個Pair<T1,T2>,用于容納兩個值,類似鍵值對,但這兩個值之間沒有任何關系。
除了提供屬性來訪問值本身之外,我們還覆蓋了Equals和GetHashCode方法,從而使這個類型的實例能很好的作為字典中的鍵來使用。
 pair<T1,T2>類

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 表示一對值的泛型類
{
    public sealed class Pair<T1, T2> : IEquatable<Pair<T1, T2>>
    {
        private static readonly IEqualityComparer<T1> FirstComparer = EqualityComparer<T1>.Default;
        private static readonly IEqualityComparer<T2> SecondComparer = EqualityComparer<T2>.Default;
        private readonly T1 first;
        private readonly T2 second;
        public Pair(T1 first, T2 second)
        {
            this.first = first;
            this.second = second;
        }
        public T1 First { get { return first; } }
        public T2 Second { get { return second; } }
        public bool Equals(Pair<T1, T2> other)
        {
            return other != null && FirstComparer.Equals(this.First, other.First) && SecondComparer.Equals(this.Second, other.Second);
        }
        public override bool Equals(object obj)
        {
            return Equals(obj as Pair<T1,T2>);
        }
        public override int GetHashCode()
        {
            return FirstComparer.GetHashCode(first) * 37 + SecondComparer.GetHashCode(second);
        }
    }
}

Pair<T1,T2>輔助類

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 表示一對值的泛型類
{
    public static class Pair
    {
        public static Pair<T1, T2> Of<T1, T2>(T1 first, T2 second)
        {
            return new Pair<T1, T2>(first,second);
        }
    }
}

主體方法

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 表示一對值的泛型類
{
    class Program
    {
        static void Main(string[] args)
        {
            Pair<string, string> pair1 = new Pair<string, string>("hello","world");
            Pair<string, string> pair2 = new Pair<string, string>("hello", "world");
            Pair<int, string> pair3 = new Pair<int, string>(1,"hello world");
            bool c = pair1.Equals(pair2);
            bool d = pair2.Equals(pair3);
            System.Console.WriteLine(c);
            System.Console.WriteLine(d);
            System.Console.WriteLine(pair2.GetHashCode());

        }
    }
}

運行結果

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩女优人人人人射在线视频| 亚洲午夜色婷婷在线| 成人情趣片在线观看免费| 日韩欧美成人精品| 午夜精品99久久免费| 海角国产乱辈乱精品视频| 亚洲黄色www网站| 欧美一区二区三区精品电影| 最近2019中文字幕一页二页| 亚洲偷熟乱区亚洲香蕉av| 欧美精品制服第一页| 欧日韩不卡在线视频| 亚洲一区二区三区四区在线播放| 亚洲欧美日韩一区二区三区在线| 最新国产精品拍自在线播放| 九九精品在线观看| 欧美国产日韩在线| 黑人巨大精品欧美一区二区一视频| 久久精品国产亚洲7777| 亚洲bt天天射| 国产一区二中文字幕在线看| 亚洲第一视频网| 91欧美视频网站| 久久久精品999| 欧美在线www| 欧美性猛交xxxx乱大交蜜桃| 亚洲欧美在线第一页| 中文字幕精品—区二区| 欧美激情欧美激情| 日韩高清av在线| 亚洲欧洲日产国码av系列天堂| 亚洲va电影大全| 伊人久久五月天| 国产精品免费视频久久久| 国产精品久久久av久久久| 久久精品99国产精品酒店日本| 国产精品露脸av在线| 日韩精品在线观看网站| 亚洲精品二三区| 国产精品视频xxx| 日韩欧美国产激情| 亚洲欧美日本精品| 精品调教chinesegay| 国产精品成人一区二区三区吃奶| 国产亚洲成精品久久| 欧美亚洲国产成人精品| 中文字幕精品国产| 亚洲欧美中文日韩v在线观看| 亚洲大尺度美女在线| 亚洲一区二区三区xxx视频| 91经典在线视频| 国产精品欧美日韩一区二区| 久久视频国产精品免费视频在线| 国产成人免费91av在线| 成人有码视频在线播放| 亚洲国产精品久久91精品| 视频一区视频二区国产精品| 久久久久久有精品国产| 欧美电影第一页| 欧美电影在线观看网站| 亚洲精品国产精品国自产观看浪潮| 国产日产欧美精品| 欧美成人第一页| 日韩中文字幕在线播放| 久久久精品日本| 欧美猛交ⅹxxx乱大交视频| 久久精品国产亚洲一区二区| 日韩视频免费看| 欧美视频一区二区三区…| 国产精品jizz在线观看麻豆| 欧美亚洲视频在线观看| 亚洲韩国欧洲国产日产av| 中文字幕9999| 亚洲自拍高清视频网站| 国产精品视频午夜| 国产精品海角社区在线观看| 国产精品日韩久久久久| 精品久久久一区二区| 亚洲码在线观看| 国产综合色香蕉精品| 2020欧美日韩在线视频| 亚洲国产福利在线| 国产精品pans私拍| 欧美日韩国产成人| 国产精品日日摸夜夜添夜夜av| 欧美区在线播放| 国内精品一区二区三区| 尤物yw午夜国产精品视频| 亚洲男子天堂网| 97在线免费观看| 久久国产精品电影| 国产精品欧美一区二区| 久久香蕉国产线看观看网| 久久99久久亚洲国产| 日韩av在线直播| 免费不卡欧美自拍视频| 亚洲第一精品夜夜躁人人爽| 国产精品成人va在线观看| 日本午夜精品理论片a级appf发布| 欧美日韩精品中文字幕| 欧美性猛交xxxxx免费看| 精品久久久久久久久久ntr影视| 日韩av中文在线| 欧美激情一区二区久久久| 欧美激情乱人伦| 青青草国产精品一区二区| 亚洲欧洲美洲在线综合| 欧美又大又硬又粗bbbbb| 日韩av电影在线播放| 欧美一区二区三区艳史| 欧美另类在线观看| 亚洲香蕉成人av网站在线观看| 夜夜嗨av色一区二区不卡| 国语自产在线不卡| 国产精品自产拍在线观看| 欧美日韩一区免费| 日韩69视频在线观看| 亚洲性xxxx| 一本色道久久88精品综合| 日韩av影片在线观看| 日韩av在线看| 国产mv免费观看入口亚洲| 日韩欧美中文在线| 久久视频在线观看免费| 69av在线播放| 亚洲人成在线电影| 亚洲加勒比久久88色综合| 成人a在线观看| 国产精品久久久久久久av大片| 欧美精品久久久久久久免费观看| 欧美成人中文字幕| 91天堂在线观看| 在线播放国产精品| 国产精品白嫩美女在线观看| 中文字幕国产精品久久| 久久精品视频在线播放| 亚洲色图狂野欧美| 欧美日韩激情视频| 亚洲综合视频1区| 欧美精品一区二区三区国产精品| 亚洲成人999| 国内精品400部情侣激情| 欧美成人精品三级在线观看| 欧美性色19p| 97不卡在线视频| 日韩精品中文字幕有码专区| 一区二区三区视频免费| 国产盗摄xxxx视频xxx69| 亚洲国产精品视频在线观看| 日韩最新av在线| 91最新国产视频| 欧美三级欧美成人高清www| 国产精品免费久久久久影院| 久久好看免费视频| 亚洲专区在线视频| 午夜精品久久久久久久白皮肤| 国产精品日韩电影| 亚洲夜晚福利在线观看| 久久好看免费视频| 国产精品免费小视频| 丝袜美腿亚洲一区二区| 久久视频在线直播| 91超碰中文字幕久久精品| 成人国产精品久久久|