自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C# 2010命名和可選參數(shù)的新特性

開(kāi)發(fā) 后端
Visual C# 2010引入了命名和可選參數(shù),經(jīng)常使用SQL Server編寫(xiě)存儲(chǔ)過(guò)程的開(kāi)發(fā)人員對(duì)此應(yīng)該比較熟悉—命名參數(shù)和可選參數(shù)與存儲(chǔ)過(guò)程的參數(shù)十分相似。

1.命名參數(shù)允許調(diào)用者通過(guò)提供參數(shù)的名稱(chēng)來(lái)為其賦值,這樣參數(shù)的位置就不在重要了??蛇x參數(shù)允許在定義時(shí)為某些參數(shù)賦值,在調(diào)用時(shí)可以忽略這些“可選的”參數(shù)。命名參數(shù)和可選參數(shù)可以應(yīng)用在方法、索引器、構(gòu)造函數(shù)和委托。命名參數(shù)和可選參數(shù)與dynamic類(lèi)型結(jié)合在一起使用,可以方便的訪(fǎng)諸如Office自動(dòng)化API之類(lèi)的COM API。

1.1 命名參數(shù)
命名參數(shù)的語(yǔ)法為:

參數(shù)名稱(chēng)1:參數(shù)值1,參數(shù)名稱(chēng)2:參數(shù)值2…

例如以下代碼:

static void Main(string[] args)
{
    CreateUser(password:"adminpassword",name:"admin");
}

static void CreateUser(string name, string password)
{
    Console.WriteLine("name:{0},password:{1}", name, password);
}

可以看到由于在調(diào)用時(shí)使用了命名參數(shù),參數(shù)的位置就不在重要了。

1.2. 可選參數(shù)
方法、構(gòu)造函數(shù)、索引器和委托的定義可以指定其參數(shù)為必選的還是可選的,在調(diào)用時(shí)必須提供必選參數(shù),但是可以省略可選參數(shù)。

還可以使用System.Runtime.InteropServices.OptionalAttribute特性類(lèi)定義可選參數(shù),該類(lèi)從1.0時(shí)代就已經(jīng)包含在基類(lèi)庫(kù)中了。

每一個(gè)可選參數(shù)的定義都包含默認(rèn)值(默認(rèn)值必須是常量),如果在調(diào)用時(shí)沒(méi)有指定該參數(shù),則使用默認(rèn)值。例如以下代碼:

static void Main(string[] args)
{
    CreateUser("admin","adminpassword",50);
}

///


/// 創(chuàng)建用戶(hù)
///

/// 用戶(hù)名稱(chēng)
/// 用戶(hù)密碼
/// 積分
/// 是否鎖定
static void CreateUser(string name, string password,
    int score=20,bool isLocked=false)
{
    Console.WriteLine("name:{0},password:{1}", name, password);
}

在所有必須參數(shù)后面定義可選參數(shù),如果在調(diào)用時(shí)提供了某個(gè)可選參數(shù)的值,那么必須提供該可選參數(shù)之前所有可選參數(shù)的值(如果此參數(shù)之前有可選參數(shù)),而不允許使用逗號(hào)分隔的形式提供參數(shù),即以下調(diào)用是錯(cuò)誤的:

CreateUser("admin","adminpassword",,true);

而必須寫(xiě)成:

CreateUser("admin","adminpassword",20,true);、

或者更好的解決辦法是使用命名參數(shù):

CreateUser("admin","adminpassword",isLocked:true);

1.3. COM API訪(fǎng)問(wèn)

命名和可選參數(shù)與dynamic和其他增強(qiáng)一起使得訪(fǎng)問(wèn)COM API更加方便。例如在C#3.0或更早的版本中在調(diào)用某些COM API時(shí),如果要省略某些參數(shù)需要使用Type.Missing,例如以下代碼(代碼系摘抄):

var excelApp = new Microsoft.Office.Interop.Excel.Application();
var myFormat =
    Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;

excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

但是有了命名和可選參數(shù)后,可以很簡(jiǎn)單的寫(xiě)成這樣:

excelApp.get_Range("A1", "B4").AutoFormat( Format: myFormat );

2. 類(lèi)型等價(jià)支持(Type Equivalence Support)(此段為翻譯)

如果嵌入來(lái)自于強(qiáng)命名托管程序集的類(lèi)型信息時(shí),可以使在某一應(yīng)用程序中的類(lèi)型與獨(dú)立的發(fā)布版本中類(lèi)型保持松散的連接。這意味著應(yīng)用程序可以在不需要重新編譯每一個(gè)版本的情況下使用多個(gè)版本托管類(lèi)庫(kù)中的類(lèi)型。

類(lèi)型嵌入經(jīng)常用于COM交互,例如使用Microsoft Office中的自動(dòng)化的應(yīng)用程序。嵌入類(lèi)型信息允許同一個(gè)應(yīng)用程序在安裝了不同的Office版本的機(jī)器上運(yùn)行。而且開(kāi)發(fā)人員可以在完全托管解決方案中使用類(lèi)型嵌入。

來(lái)自于某個(gè)程序中可以嵌入的類(lèi)型需要滿(mǎn)足以下條件:

該程序集至少暴露一個(gè)公共接口。
該嵌入接口使用ComImport和Guid特性聲明
該程序集使用ImportedFromTypeLib和一個(gè)程序集級(jí)別的Guid特性標(biāo)注(默認(rèn)情況下Visual Basic和Visual C#模版已包含了程序集的Guid特性)。
在指定可以嵌入的公共接口后,可以創(chuàng)建實(shí)現(xiàn)了這些接口的類(lèi)??蛻?hù)端程序可以在設(shè)計(jì)時(shí)引用包含了這些公共接口的程序何并且默認(rèn)Embed Interop Types屬性為true以嵌入類(lèi)型信息(在命令行使用/link編譯開(kāi)關(guān)可以達(dá)到相同的效果),接下來(lái)客戶(hù)端可以創(chuàng)建這些接口的實(shí)例。如果您創(chuàng)建了強(qiáng)命名運(yùn)行時(shí)程序集的新版本,客戶(hù)端不需要使用新的程序集重新編譯,相反,客戶(hù)端程序通過(guò)公共接口的嵌入類(lèi)型信息繼續(xù)使用可用的程序集的版本

2.1. 首先創(chuàng)建一個(gè)強(qiáng)命名接口類(lèi)庫(kù)(根據(jù)滿(mǎn)足條件設(shè)置屬性)

[ComImport]
[Guid("8DA56996-A151-4136-B474-32784559F6DF")]
public interface ISampleInterface
{
    void GetUserInput();
    string UserInput { get; }
}

2.2. 創(chuàng)建強(qiáng)命名類(lèi)庫(kù),引用接口類(lèi)庫(kù)并定義實(shí)現(xiàn)以上接口的類(lèi):

public classSampleClass: ISampleInterface
{
    private stringp_UserInput;
    public stringUserInput { get{ return p_UserInput; } }

    public voidGetUserInput()
    {
        Console.WriteLine("Please enter a value:");
        p_UserInput = Console.ReadLine();
    }
}

2.3. 創(chuàng)建客戶(hù)端應(yīng)用程序,引用接口并使用反射的方法動(dòng)態(tài)創(chuàng)建類(lèi)型執(zhí)行相應(yīng)操作:

class Program
{
    static void Main(string[] args)
    {
        Assembly sampleAssembly = Assembly.Load("TypeEquivalenceRuntime");
        ISampleInterface sampleClass =
            (ISampleInterface)sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass");
        sampleClass.GetUserInput();
        Console.WriteLine(sampleClass.UserInput);
        Console.WriteLine(sampleAssembly.GetName().Version.ToString());
        Console.ReadLine();
    }
}


4. 修改實(shí)現(xiàn)了接口在的客戶(hù)端類(lèi),增加新的方法并修改程序集版本號(hào)和文件版本號(hào)為2.0.0.0:

public DateTime GetDate()
{
    return DateTime.Now;
}

5. 再次執(zhí)行客戶(hù)端程序,觀察不同(客戶(hù)端將輸出新的版本號(hào))。

在.NET全部使用托管代碼創(chuàng)建的程序集自動(dòng)會(huì)識(shí)別更新,也就是說(shuō)不需要使用額外的屬性定義,直接創(chuàng)建接口、實(shí)現(xiàn)接口類(lèi)庫(kù)和客戶(hù)端類(lèi)(或者沒(méi)有接口直接創(chuàng)建類(lèi)庫(kù)在客戶(hù)端引用),在類(lèi)庫(kù)更新后復(fù)制到客戶(hù)端引用的位置,客戶(hù)端會(huì)自動(dòng)檢測(cè)到該更新,這也是.NET程序集為開(kāi)發(fā)人員帶來(lái)的好處。但是使用類(lèi)型等價(jià)支持的作用體現(xiàn)在什么地方,我認(rèn)為還是方便了COM API的訪(fǎng)問(wèn),因?yàn)镃OM可能是使用其他語(yǔ)言編寫(xiě)的,沒(méi)有辦法做到像.NET程序集那樣自動(dòng)感應(yīng)版本變化,個(gè)人意見(jiàn),期望高手解答。

3. 總結(jié)

Visual C#中提供了動(dòng)態(tài)類(lèi)型、命名參數(shù)、可選參數(shù)和類(lèi)型等價(jià)支持,為編程帶來(lái)便利,對(duì)于訪(fǎng)問(wèn)COM API來(lái)說(shuō)更方便了。而且微軟多次提到了諸如Office之類(lèi)的文字,是不是意味著微軟在不斷的鼓勵(lì)程序員不斷開(kāi)發(fā)出其于Office的一些應(yīng)用,亦或是現(xiàn)在其于Office的應(yīng)用在不斷增加,還是應(yīng)用程序中與Office的交互在不斷增加,通過(guò)增強(qiáng)的特性使這些工作更方便,來(lái)鞏固微軟件地位?一家之言,請(qǐng)高手不吝賜教。

【編輯推薦】

  1. Visual C# 2010新特性之dynamic類(lèi)型
  2. 探討C#中的實(shí)體驗(yàn)證(Entity Validation)
  3. C#中實(shí)現(xiàn)多繼承的方式:混合+接口
責(zé)任編輯:彭凡 來(lái)源: cnblogs
相關(guān)推薦

2009-05-27 11:30:20

C#Visual Stud協(xié)變

2009-05-25 15:42:03

Visual StudC#

2009-08-26 17:10:09

C# 3.5新特性

2009-07-08 09:47:49

Scala 2.8Scala

2009-08-31 14:45:07

Visual C# 3

2009-08-19 16:51:14

C# 4.0 dyna

2009-08-27 16:24:48

擴(kuò)展方法C# 3.0新特性

2009-11-11 09:48:06

Visual Stud

2009-03-10 13:51:36

編譯器VS2010C#

2009-08-19 16:50:32

Visual C#C#語(yǔ)言特性

2009-07-31 18:18:33

Camel命名法C#命名規(guī)范

2009-05-26 09:28:22

C# 4.0dynamic動(dòng)態(tài)類(lèi)型

2016-10-13 13:33:41

反射特性c#

2010-01-14 10:56:43

Visual C++

2009-08-13 09:46:49

C#歷史C# 4.0新特性

2009-07-02 10:07:24

C# 4.0的動(dòng)態(tài)類(lèi)型Visual Stud

2009-08-24 18:01:45

C#3.0新特性

2009-05-26 11:15:31

C# 4.0dynamicVisual Stud

2013-05-16 10:33:11

C#C# 5.0Async

2009-07-06 11:00:56

.NET 4.0新特性.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)