C# 7 新特性-1

gfxz8761 8年前發布 | 32K 次閱讀 C# .NET開發

來自: http://www.cnblogs.com/yanbinliu/p/5205748.html

來源https://www.kenneth-truyers.net/2016/01/20/new-features-in-c-sharp-7/

Tuples

What

Tuples是數據的臨時分組。區別與struct和class,后兩者需要預先定義。

Why

數據臨時分組的最常用場景就是方法的返回值。目前有三種方式。

Out 參數

public void GetLatLng(string address, out double lat, out double lng) { ... }

double lat, lng;
GetLatLng(myValues, out lat, out lng);
Console.WriteLine($"Lat: {lat}, Long: {lng}");

這種方法的缺點就是不能對async方法使用,還必須提前聲明變量,out參數聲明時還不能使用var。

Tuple-type

public Tuple<int, int> GetLatLng(string address) { ... }

var latLng = GetLatLng("some address");
Console.WriteLine($"Lat: {latLng.Item1}, Long: {latLng.Item2}"); 

這種方式沒有Out參數的缺點,但是因為tuple的返回值是item1和item2之類的,含義不清晰。

class/struct

struct LatLng{ public double Lat; public double Lng;}
public LatLng GetLatLng(string address) { ... }

var ll= GetLatLng("some address");
Console.WriteLine($"Lat: {ll.Lat}, Long: {ll.Lng}"); 

這個缺點就是比較啰嗦和無意義的overhead(如果返回類型僅使用一次的話)

How

在c#7中有幾種不同的方式可以滿足這種場景。

Tuple return types

就是多返回值的情形,如下

public (double lat, double lng) GetLatLng(string address) { ... }

var ll = GetLatLng("some address"); 
Console.WriteLine($"Lat: {ll.lat}, Long: {ll.lng}");

內聯tuples

可以如下創建tuples

var ll = new (double lat, double lng) { lat = 0, lng = 0 };

tuple解構

因為將數據捆綁作為概念不是那么重要,所以可能你不想通過捆綁獲取數據,而是直接獲取。所以你可以直接結構多返回值而不是通過捆綁的tuple(即返回的變量ll)。

(var lat, var lng) = GetLatLng("some address");
Console.WriteLine($"Lat: {lat}, Long: {lng}");

Record類型

是什么

Record類型是屬性的簡單打包,數據類型中只有屬性。

為什么

class和struct僅僅包含屬性的情況下,仍然需要一大對聲明,相當繁瑣。如下

class MyPoint
{
    int _x;
    int _y;
    int _z;
    MyPoint(int x, int y, int z){
        this._x = x;
        this._y = y;
        this._z = z;
    }
    public int X {get{ return this._x;}}
    public int Y {get{ return this._y;}}
    public int Z {get{ return this._z;}}
}

How

有了Record類型,你可以一行實現。如下

class Point(int X, int Y, int Z);

而且代碼后面替你做了更多事情。

1.類會自動實現IEquatable

,這樣你可以基于他們的值來比較兩個Record類型,而不是引用。

2.ToString方法會輸出record中的值。

模式匹配

是什么

有了record類型,我們能使用內置的模式匹配。模式匹配意味著you can switch on the type of data you have to execute one or the other statement.

為什么

盡管模式匹配有點像if/else,但是還是有自身的優勢的。

1.你可以對任何數據類型做模式匹配,即使自定義類型,而if/else需要基礎類型來match

2.模式匹配可以從表達式中抽取值。(意思應該是可以根據表達式的類型來匹配)

How

模式匹配如下

class Geometry();
class Triangle(int Width, int Height, int Base) : Geometry;
class Rectangle(int Width, int Height) : Geometry;
class Square(int width) : Geometry;

Geometry g = new Square(5);
switch (g)
{
    case Triangle(int Width, int Height, int Base):
        WriteLine($"{Width} {Height} {Base}");
        break;
    case Rectangle(int Width, int Height):
        WriteLine($"{Width} {Height}");
        break;
    case Square(int Width):
        WriteLine($"{Width}");
        break;
    default:
        WriteLine("<other>");
        break;
}

如上可以看到如何對數據類型進行模式匹配,以及對其立即解構。

結論

如上僅僅是即將到了的c#新特性中的三個。

 本文由用戶 gfxz8761 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!