亚洲一区亚洲二区亚洲三区,国产成人高清在线,久久久精品成人免费看,999久久久免费精品国产牛牛,青草视频在线观看完整版,狠狠夜色午夜久久综合热91,日韩精品视频在线免费观看

C#函數(shù)式編程之可選值 -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【www.ishadingyu.com - 電腦資料】

      在我們的實際開發(fā)中已經(jīng)會遇到可空類型,而在C#中自從2.0之后就提供了可空類型(Nullable),普通的值類型是不可以賦值為NULL,但是在類型的后面加上問號就變成了可空類型,這樣就可以賦值為NULL了,

C#函數(shù)式編程之可選值

。當然這樣的方式也可以用于函數(shù)式編程中,但函數(shù)式編程有自己的獨特方式來解決這種問題,今天我們將圍繞這個問題,雖然篇幅比較少,但也請讀者可以閱讀完。

    我們當然不能改變語言的設計,所以我們只能使用現(xiàn)有的來實現(xiàn)可選值。這里我們利用類來實現(xiàn),下面是Option初期的代碼:

    1    public sealed class Option

    2    {

    3      private readonly T value;

    4      public T Value

    5      {

    6        get

    7        {

    8          return value;

    9        }

    10      }

    11

    12      private readonly bool hasValue;

    13      public bool HasValue { get { return hasValue; } }

    14      public bool IsSome { get { return hasValue; } }

    15      public bool IsNone { get { return !hasValue; } }

    16

    17      public Option(T value)

    18      {

    19        this.value = value;

    20        this.hasValue = true;

    21      }

    22

    23      private Option() { }

    24      public static readonly Option None = new Option();

    25    }

    這樣我們就可以利用這個類來實現(xiàn)和可空類型一樣的效果,比如下面這段代碼:

    1      var p1 = new Option(10);

    2      var p2 = Option.None;

    3      if (p1.HasValue) // 等價于 x != null

    4      {

    5

    6      }

    我們可以看到在實例化Option的時候還需要傳遞類型參數(shù),這里我們可以通過一個技巧來避免輸入類型參數(shù),而依賴于類型推斷,這里我們寫個輔助類:

    1    public sealed class Option

    2    {

    3      public static Option Some(T value)

    4      {

    5        return new Option(value);

    6      }

    7    }

    其實我們只是利用了一個泛型方法來創(chuàng)建這個實例就可以了,下面我們看看下面的示例:

    1    static void Main(string[] args)

    2    {

    3      var p1 = Option.Some(10);

    4      var p2 = Option.Some(10);

    5      if (p1 == p2)

    6      {

    7        Console.WriteLine("Y");

    8      }

    9      Console.ReadKey();

    10    }

    這里我們看到Option.Some節(jié)省了一些功夫,但是讀者如果運行上面這個例子會發(fā)現(xiàn),“Y”并不會輸出到控制臺中,但是我們可以看到10本來就應該等于10,

電腦資料

C#函數(shù)式編程之可選值》(http://www.ishadingyu.com)。因為這里我們對比的是Option類型,并且p1和p2是兩個不同的Option所以我們還需要加以改善,下面我們重載操作符(在Option類中繼續(xù)追加):

    1      public static bool perator ==(Option a, Option b)

    2      {

    3        return a.HasValue == b.HasValue && EqualityComparer.Default.Equals(a.Value, b.Value);

    4      }

    5      public static bool operator !=(Option a, Option b)

    6      {

    7        return !(a == b);

    8      }

    9

    10      public override int GetHashCode()

    11      {

    12        int hashCode = hasValue.GetHashCode();

    13        if (hasValue)

    14          hashCode ^= value.GetHashCode();

    15        return hashCode;

    16      }

    這里我們通過重載“==”判斷其中的Value,這樣就可以解決上面的問題了。但是我們還有一個問題沒有解決,就是在使用None的時候還需要傳遞類型參數(shù),這里我們依然需要使用一個技巧來避免(在Option類中繼續(xù)追加):

    public static readonly Option None = new Option();

    僅僅這樣還不足夠,因為Option無法轉(zhuǎn)換成Option類型所以我們還需要對Option增加 功能,能夠隱式的將Option轉(zhuǎn)換成對應的Option類型,下面是針對的代碼(在Option中增加):

    1      public static implicit operator Option(Option option)

    2      {

    3        return Option.None;

    4      }

    這樣我們就可以直接將Option與Option進行對比了,到這里我們就完成了我們自己的可選值的實現(xiàn),在具體的項目中是使用可空類型還是可選值完全可以根據(jù)你個人的喜好,筆者建議使用本節(jié)介紹的可選值。

最新文章