999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

使用C# 7元組語言特性優化數據驅動軟件研究

2017-09-29 17:27:24謝小魁
軟件導刊 2017年9期

摘 要:C#作為一種現代編程語言,廣泛應用于通用業務系統開發。由于早期的C#語法限制,在數據密集型領域使用MatLab、Python、IDL(Interactive Data Language)等動態腳本語言更為合適。C# 7新增了簡單靈活的輕量級元組類型。分析了元組的幾個典型應用場景,并給出了具體示例,包括多變量初始化、多變量賦值、多變量互換、封裝函數返回的多變量、作為中間層的數據容器、用于LINQ select表達式獲得語義信息,以及利用析構(deconstructing)實現對象到元組的自動轉換等。實踐表明,元組適合數據驅動領域開發,提高了生產效率,達到了動態語言效果。對C# 7 tuple存在的缺陷,如deconstructing的非對稱性、賦值的非傳遞性和可變性(mutable)等提出了改進意見,為利用開源編譯器Roslyn優化C#特性提供了設計思路。

關鍵詞:元組;動態腳本;語言設計;編譯器Roslyn

DOI:10.11907/rjdk.171599

中圖分類號:TP301 文獻標識碼:A 文章編號:1672-7800(2017)009-0007-03

Abstract:As a modern developing language, C# was widely used in general-purpose software development. But due to C# syntax limitation in the past, data-intensive application domain were dominated by dynamic script languages such as MatLab, Python, IDL(Interactive Data Language). C# 7 introduces tuple feature which is a simple and flexible data type.Typical application scenarios were analyzed and example details were presented, including initialization, assignment and swap of multiple variables, packing return values of a method, providing semantic information in LINQ select and transform object to tuple members automatically. The study showed that C# tuple is suitable for data-driven software development in order to improve developer productivity and achieves effects of dynamic languages. At last, the C# 7 defects in design, including asymmetry of deconstructing, non-transitivity of assignment and mutable were analyzed, and corresponding updating suggestion were presented, providing ideal for optimize C# 7 features in the future using open source compiler Roslyn.

Key Words:Tuple; Dynamic Script; Language Design; Compiler Roslyn

0 引言

C#作為一種通用的面向對象編程語言,提供了豐富的類型系統,使得編譯器可進行強類型語法檢查,能較好保證代碼的安全性,在用戶界面、數據庫、網絡、多媒體和地理信息系統等通用軟件開發領域有著廣泛應用。但由于語法限制,過去在數據驅動和交互腳本領域,僅僅是提取數據,開發者需要編寫大量額外的類或結構體,掩蓋了開發者的設計意圖,降低了開發效率;同時C#的類實例(class instance)是引用類型(reference),會帶來較大性能損失。

C# 7引入了tuple(元組)類型,由編譯器和IDE(Integrated Development Environment)提供上下文智能感知和強類型檢查,在Visual Studio 2017中可以使用。元組是一種比類和結構體更簡單靈活的輕量級(lightweight)值類型(ValueType),完全不同于以前.NET平臺的Tuple泛型API(Application Programming Interface)。為此,本文探討該元組特性在數據驅動領域的開發及應用。

1 應用場景和示例

1.1 多變量同時初始化

若不利用元組語言特性,兩個變量初始化一般做法為:

string name = "XiangRikui";

int age = 10;

利用元組語言特性,兩個變量初始化可寫成下面的第1句,第2句和第3句具有同樣效果,只是利用了C#[1-8]的隱形類型(implicit type),由編譯器的類型推斷(type inference)功能確定真正的強類型(strong type)。

(string name, int age) = ("XiangRikui", 10);

(var name, var age) = ("XiangRikui", 10);endprint

var (name, age) = ("XiangRikui", 10);

1.2 多變量同時賦值

int age;

string name;

(name, age) = ("XiangRikui", 1);

利用元組的多變量同時初始化和同時賦值功能,計算斐波那契數列,可達到同動態語言Python相同的精簡[9]:

int num = 100;

var (a, b) = (0, 1);

var fib = new List(); // containing Fibonacci series up to n

while (b < num)

{

fib.Add(b);

(a, b) = (b, a + b);

}

1.3 交換變量值

對于兩個相同類型(例如字符串)的變量a和b,要交換值,傳統的做法是引入第3個臨時變量,而且要考慮臨時變量的數據類型。

string temp = a;

a = b;

b = t;

利用元組,不用引入臨時變量,可直接互換,這在數據排序里非常有用。利用這一特性,可同時交換任意數量的變量值。

(a, b) = (b, a);

1.4 封裝函數返回的多個變量

在動態腳本語言如MatLab、Python和ENVI IDL(Interactive Data Language)中,都支持函數返回多個變量。但過去在C#中,一般需要編寫新的類或結構體,而類或結構體意味著對數據操作,這掩蓋了開發者意圖,同時也帶來了性能損失。利用元組,可以封裝(pack)函數返回的多個變量。

例如,利用全站儀測量的水平距離和方位角,不用編寫新的Point類型就可直接利用元組返回函數計算坐標增量(x, y)。

using static System.Math;

//from length and angle to compute coordinate increment (x,y)

public static (double x, double y) Rect(double length, double angle)

{

double x = length * Cos(angle);

double y = length * Sin(angle);

return (x, y);

}

//tuple function call demo

double len, alpha;

//…

var p = Rect(len, alpha);

1.5 作為中間層的數據容器

元組可存儲來自文本文件、Excel、XMl和數據庫中的數據,代替重量級的DataTable或自定義類型。

例如,激光掃描儀測量的彩色激光點云,同時具有三維坐標和顏色信息,利用元組返回測量值可表示如下:

(double x, double y, double z, int r, int g, int b) cloudPoint=GetCloudPoint();

1.6 獲得語義信息

LINQ表達式中,select用命名元組(named tuple)表示可以獲得的語義信息 :

IEnumerable<(int ID, string Title)> currentItems =

from item in AllItems

select (item.ID, item.Title);

如果不利用命名元組,則要么生成匿名對象,要么需要處理Item1、Item2這樣的非語義名稱。

1.7 實現對象到元組的自動轉換

在類中定義Deconstruct函數,把組成該類型的字段用out參數表示:

public class Point

{

public Point(double x, double y)

{

this.X = x;

this.Y = y;

}

public double X { get; }

public double Y { get; }

//Deconstruct corresponding to tuple element unpack

public void Deconstruct(out double x, out double y)

{

x = this.X;

y = this.Y;

}

public static Point Construct((double x, double y) tuple)

{

Point result = new Point(tuple.x, tuple.y);

return result;

}

}

利用析構(Deconstruction)功能,編譯器可拆封用戶自定義類型字段,提取字段到相應的元組成員,實現對象到tuple(字段)的自動轉換,tuple字段與Construct函數中的out變量一一對應:endprint

var p = new Point(3.14, 6.28);

(double X, double Y) = p;

2 C# 7 tuple存在的缺陷及設計建議

2.1 Deconstruction設計的非對稱性

C# 7支持對象到元組(字段)的自動轉換,但不支持tuple到對象的自動轉換。在類中定義Deconstruct函數后,可以利用tuple自動提取相應字段,輕松實現對象到tuple(成員字段)的轉換。但即使類實現了Construct函數,C#卻沒有提供tuple(成員字段)到對象的自動轉換功能:

Point p = Point.Construct((3.14, 6.28));//right

// Cannot implicitly convert type '(double, double)' to 'Program.Point'

// Point p = (3.14, 6.28);//error

建議:增加Construct支持Deconstruction。

從語法設計的角度,增加對Construct的支持,由編譯器進行類型檢查,并自動調用Construct函數實現從元組到對象的自動轉換:

Var tuple = (3.14, 6.28);

ClassName p = tuple; //設計建議,由編譯器自動調用對應類的ClassName.Construct

ClassName p = ClassName.Construct(tuple);//right

2.2 tuple與Deconstruction賦值的非傳遞性

當賦值操作符右邊為元組字面常量(tuple literal)時,左邊可以命名元組變量(named tuple),或者拆封(unpack)元組成員。但當賦值操作符右邊為對象時,左邊只能為拆封元組成員形式,不能為元組變量:

/* 1 */ (double X, double Y) tuple = (3.14, 6.28); // tuple literal, right

/* 2 */ (double X, double Y) = (3.14, 6.28); // tuple literal, right

/* 3 */ var p = new Point(3.14, 6.28); //class object

/* 4 */ (double X, double Y) = p; // class object, right

//Cannot implicitly convert type 'Program.Point' to '(double x, double y)

/* 5 */ (double X, double Y) tuple = p; // error

建議:當賦值操作符右邊為對象實例時,左邊支持命名數組。

2.3 元組可變類型

元組是值類型(ValueType),屬于可變類型(mutable)。在C#中,ValueType被認為是可變類型。在并行計算、多線程計算中,可變類型不是安全的類型。

建議:增加不可變元組(immutable tuple)

對所有值類型增加關鍵字immutable,以適用并行計算和多線程計算:

immutable var (X, Y) tuple = (3.14, 6.28);

3 結語

利用tuple打包(pack)數據,可以獲得類似Python、MatLab和ENVI IDL(Interactive Data Language)等動態語言效果。但目前C#元組存在一些小的設計缺陷,通過修改C#開源編譯器Roslyn[10],可以設計新特性。加上C#的動態特性(dynamic)、并行計算(parallel)、異步計算(async)、函數式編程(functional)和跨平臺(.NET Core)等新特性,使這一通用語言在數據驅動、甚至在數值計算密集型領域得到更廣泛的應用。

參考文獻:

[1] 沈宮新.基于C#的Windows窗體端口掃描程序分析[J].軟件導刊,2017(1):38-40.

[2] 嚴真卿,楊增汪.基于C#的即時通訊工具開發[J].電子技術與軟件工程,2014(14):95-138.

[3] 周虎.基于C#的Excel數據批量導入SqlServer的方法研究與實現[J].軟件工程師,2014(12):54-56.

[4] 王舜.基于C#的C/S和B/S職場發展分析[J].計算機光盤軟件與應用,2014(2):135-136.

[5] 謝小魁,陳青海,周清,等.基于C#.NET和開放數據的大比例尺高精度數字高程模型提取研究[J].測繪與空間地理信息,2016(9):13-15.

[6] 謝小魁,方武生,田良輝,等.基于EXCEL VSTO的測量導線計算教學系統設計[J].礦山測量,2016(4):95-122.

[7] MICROSOFT. What's new in C# 7[EB/OL]. https://docs.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7.

[8] MICROSOFT. C# tuple types[EB/OL]. https://docs.microsoft.com/en-us/dotnet/articles/csharp/tuples.

[9] PYTHON SOFTWARE FOUNDATION. Defining functions[EB/OL]. https://docs.python.org/3/tutorial/controlflow.html#defining-functions.

[10] MICROSOFT. .NET compiler platform ("Roslyn")[EB/OL]. https://github.com/dotnet/Roslyn.

(責任編輯:杜能鋼)endprint

主站蜘蛛池模板: 欧美一级高清片欧美国产欧美| 精品夜恋影院亚洲欧洲| 亚洲女同欧美在线| 亚洲男人的天堂在线观看| 中文字幕久久波多野结衣| 色男人的天堂久久综合| 国产黄在线观看| 亚洲欧美另类视频| 国产成人亚洲精品蜜芽影院| 欧美高清三区| 美女被操91视频| 日本91在线| 亚洲侵犯无码网址在线观看| 亚洲国产高清精品线久久| 99精品这里只有精品高清视频| 国产一区二区三区在线观看视频 | 在线不卡免费视频| 久久久噜噜噜| 国产精品亚洲va在线观看| 国产视频a| 国产精品亚洲一区二区在线观看| 国产在线视频福利资源站| 九色91在线视频| 成年av福利永久免费观看| 91丨九色丨首页在线播放| 国产精品不卡永久免费| 成人午夜亚洲影视在线观看| 国产91视频观看| 国产精品自在线天天看片| 自拍偷拍欧美| 亚洲视频影院| 亚洲嫩模喷白浆| 午夜激情婷婷| 国产精品手机在线观看你懂的| 亚洲欧美一区在线| 国产Av无码精品色午夜| 精品伊人久久久久7777人| 免费人欧美成又黄又爽的视频| 亚洲午夜国产片在线观看| 伊人久久福利中文字幕| 玖玖精品视频在线观看| 国产第二十一页| 日本午夜精品一本在线观看 | 亚洲精品无码专区在线观看| 欧美福利在线| 国产第八页| 免费无遮挡AV| 四虎永久在线视频| 亚洲精品无码av中文字幕| 亚洲国产成人综合精品2020 | 伊人蕉久影院| 中国一级特黄大片在线观看| 在线观看av永久| 欧美区一区二区三| 欧美一级大片在线观看| 成人年鲁鲁在线观看视频| 99久久国产综合精品女同| 伊人久久大香线蕉影院| 午夜精品区| 国产欧美视频在线观看| 国产精品一线天| 亚洲AV电影不卡在线观看| 国产免费久久精品99re丫丫一| 日韩欧美中文字幕在线精品| 在线观看无码av五月花| 亚洲欧美一区二区三区蜜芽| 欧美一级特黄aaaaaa在线看片| 黄色网址免费在线| 欧美性久久久久| 一本色道久久88| 精品一區二區久久久久久久網站| 亚国产欧美在线人成| 国产情侣一区二区三区| 国产黄网站在线观看| 国产91视频免费观看| 欧美一级黄色影院| 国产成熟女人性满足视频| 四虎永久在线精品国产免费| 99精品福利视频| 国产高清精品在线91| 国产在线精品99一区不卡| 久久精品国产91久久综合麻豆自制|