在我們的實際開發(fā)中已經(jīng)會遇到可空類型,而在C#中自從2.0之后就提供了可空類型(NullableC#函數(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
25 }
這樣我們就可以利用這個類來實現(xiàn)和可空類型一樣的效果,比如下面這段代碼:
1 var p1 = new Option
2 var p2 = Option
3 if (p1.HasValue) // 等價于 x != null
4 {
5
6 }
我們可以看到在實例化Option的時候還需要傳遞類型參數(shù),這里我們可以通過一個技巧來避免輸入類型參數(shù),而依賴于類型推斷,這里我們寫個輔助類:
1 public sealed class Option
2 {
3 public static Option
4 {
5 return new Option
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 1 public static bool perator ==(Option
2 {
3 return a.HasValue == b.HasValue && EqualityComparer
4 }
5 public static bool operator !=(Option
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
1 public static implicit operator Option
2 {
3 return Option
4 }
這樣我們就可以直接將Option與Option