• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      使用C# 7元組語(yǔ)言特性優(yōu)化數(shù)據(jù)驅(qū)動(dòng)軟件研究

      2017-09-29 17:27謝小魁
      軟件導(dǎo)刊 2017年9期
      關(guān)鍵詞:元組

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

      關(guān)鍵詞:元組;動(dòng)態(tài)腳本;語(yǔ)言設(shè)計(jì);編譯器Roslyn

      DOI:10.11907/rjdk.171599

      中圖分類號(hào):TP301 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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#作為一種通用的面向?qū)ο缶幊陶Z(yǔ)言,提供了豐富的類型系統(tǒng),使得編譯器可進(jìn)行強(qiáng)類型語(yǔ)法檢查,能較好保證代碼的安全性,在用戶界面、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、多媒體和地理信息系統(tǒng)等通用軟件開(kāi)發(fā)領(lǐng)域有著廣泛應(yīng)用。但由于語(yǔ)法限制,過(guò)去在數(shù)據(jù)驅(qū)動(dòng)和交互腳本領(lǐng)域,僅僅是提取數(shù)據(jù),開(kāi)發(fā)者需要編寫(xiě)大量額外的類或結(jié)構(gòu)體,掩蓋了開(kāi)發(fā)者的設(shè)計(jì)意圖,降低了開(kāi)發(fā)效率;同時(shí)C#的類實(shí)例(class instance)是引用類型(reference),會(huì)帶來(lái)較大性能損失。

      C# 7引入了tuple(元組)類型,由編譯器和IDE(Integrated Development Environment)提供上下文智能感知和強(qiáng)類型檢查,在Visual Studio 2017中可以使用。元組是一種比類和結(jié)構(gòu)體更簡(jiǎn)單靈活的輕量級(jí)(lightweight)值類型(ValueType),完全不同于以前.NET平臺(tái)的Tuple泛型API(Application Programming Interface)。為此,本文探討該元組特性在數(shù)據(jù)驅(qū)動(dòng)領(lǐng)域的開(kāi)發(fā)及應(yīng)用。

      1 應(yīng)用場(chǎng)景和示例

      1.1 多變量同時(shí)初始化

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

      string name = "XiangRikui";

      int age = 10;

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

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

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

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

      1.2 多變量同時(shí)賦值

      int age;

      string name;

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

      利用元組的多變量同時(shí)初始化和同時(shí)賦值功能,計(jì)算斐波那契數(shù)列,可達(dá)到同動(dòng)態(tài)語(yǔ)言Python相同的精簡(jiǎn)[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 交換變量值

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

      string temp = a;

      a = b;

      b = t;

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

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

      1.4 封裝函數(shù)返回的多個(gè)變量

      在動(dòng)態(tài)腳本語(yǔ)言如MatLab、Python和ENVI IDL(Interactive Data Language)中,都支持函數(shù)返回多個(gè)變量。但過(guò)去在C#中,一般需要編寫(xiě)新的類或結(jié)構(gòu)體,而類或結(jié)構(gòu)體意味著對(duì)數(shù)據(jù)操作,這掩蓋了開(kāi)發(fā)者意圖,同時(shí)也帶來(lái)了性能損失。利用元組,可以封裝(pack)函數(shù)返回的多個(gè)變量。

      例如,利用全站儀測(cè)量的水平距離和方位角,不用編寫(xiě)新的Point類型就可直接利用元組返回函數(shù)計(jì)算坐標(biāo)增量(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 作為中間層的數(shù)據(jù)容器

      元組可存儲(chǔ)來(lái)自文本文件、Excel、XMl和數(shù)據(jù)庫(kù)中的數(shù)據(jù),代替重量級(jí)的DataTable或自定義類型。

      例如,激光掃描儀測(cè)量的彩色激光點(diǎn)云,同時(shí)具有三維坐標(biāo)和顏色信息,利用元組返回測(cè)量值可表示如下:

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

      1.6 獲得語(yǔ)義信息

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

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

      from item in AllItems

      select (item.ID, item.Title);

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

      1.7 實(shí)現(xiàn)對(duì)象到元組的自動(dòng)轉(zhuǎn)換

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

      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;

      }

      }

      利用析構(gòu)(Deconstruction)功能,編譯器可拆封用戶自定義類型字段,提取字段到相應(yīng)的元組成員,實(shí)現(xiàn)對(duì)象到tuple(字段)的自動(dòng)轉(zhuǎn)換,tuple字段與Construct函數(shù)中的out變量一一對(duì)應(yīng):endprint

      var p = new Point(3.14, 6.28);

      (double X, double Y) = p;

      2 C# 7 tuple存在的缺陷及設(shè)計(jì)建議

      2.1 Deconstruction設(shè)計(jì)的非對(duì)稱性

      C# 7支持對(duì)象到元組(字段)的自動(dòng)轉(zhuǎn)換,但不支持tuple到對(duì)象的自動(dòng)轉(zhuǎn)換。在類中定義Deconstruct函數(shù)后,可以利用tuple自動(dòng)提取相應(yīng)字段,輕松實(shí)現(xiàn)對(duì)象到tuple(成員字段)的轉(zhuǎn)換。但即使類實(shí)現(xiàn)了Construct函數(shù),C#卻沒(méi)有提供tuple(成員字段)到對(duì)象的自動(dòng)轉(zhuǎn)換功能:

      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。

      從語(yǔ)法設(shè)計(jì)的角度,增加對(duì)Construct的支持,由編譯器進(jìn)行類型檢查,并自動(dòng)調(diào)用Construct函數(shù)實(shí)現(xiàn)從元組到對(duì)象的自動(dòng)轉(zhuǎn)換:

      Var tuple = (3.14, 6.28);

      ClassName p = tuple; //設(shè)計(jì)建議,由編譯器自動(dòng)調(diào)用對(duì)應(yīng)類的ClassName.Construct

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

      2.2 tuple與Deconstruction賦值的非傳遞性

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

      /* 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

      建議:當(dāng)賦值操作符右邊為對(duì)象實(shí)例時(shí),左邊支持命名數(shù)組。

      2.3 元組可變類型

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

      建議:增加不可變?cè)M(immutable tuple)

      對(duì)所有值類型增加關(guān)鍵字immutable,以適用并行計(jì)算和多線程計(jì)算:

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

      3 結(jié)語(yǔ)

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

      參考文獻(xiàn):

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

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

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

      [4] 王舜.基于C#的C/S和B/S職場(chǎng)發(fā)展分析[J].計(jì)算機(jī)光盤(pán)軟件與應(yīng)用,2014(2):135-136.

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

      [6] 謝小魁,方武生,田良輝,等.基于EXCEL VSTO的測(cè)量導(dǎo)線計(jì)算教學(xué)系統(tǒng)設(shè)計(jì)[J].礦山測(cè)量,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.

      (責(zé)任編輯:杜能鋼)endprint

      猜你喜歡
      元組
      基于詞嵌入的元組級(jí)數(shù)據(jù)溯源方法
      Python核心語(yǔ)法
      針對(duì)隱藏Web數(shù)據(jù)庫(kù)的Skyline查詢方法研究*
      QJoin:質(zhì)量驅(qū)動(dòng)的亂序數(shù)據(jù)流連接處理技術(shù)*
      一種基于時(shí)間戳的簡(jiǎn)單表縮減算法?
      海量數(shù)據(jù)上有效的top-kSkyline查詢算法*
      Mixly開(kāi)源項(xiàng)目設(shè)計(jì)28:秒懂74HC595移位寄存器(三)
      不確定數(shù)據(jù)的有效查詢處理評(píng)估技術(shù)研究
      基于減少檢索的負(fù)表約束優(yōu)化算法
      基于差異化聚類的分級(jí)隱私保護(hù)數(shù)據(jù)發(fā)布方法
      深州市| 台北县| 阿拉善盟| 衡水市| 奉新县| 晋江市| 罗城| 莒南县| 长岭县| 丹寨县| 唐山市| 西峡县| 酉阳| 岳阳市| 钟祥市| 潜山县| 苏尼特右旗| 新沂市| 永嘉县| 沾化县| 葫芦岛市| 铜陵市| 吕梁市| 疏附县| 潞城市| 湄潭县| 合山市| 深水埗区| 岐山县| 南京市| 奇台县| 桃园县| 潮安县| 庄河市| 通渭县| 柘荣县| 和平县| 大兴区| 玛沁县| 六盘水市| 秭归县|