您好,登錄后才能下訂單哦!
這篇文章主要介紹了C#中visual studio 2010命名和可選參數(shù)的特性有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
1.命名參數(shù)允許調(diào)用者通過提供參數(shù)的名稱來為其賦值,這樣參數(shù)的位置就不在重要了??蛇x參數(shù)允許在定義時(shí)為某些參數(shù)賦值,在調(diào)用時(shí)可以忽略這些“可選的”參數(shù)。命名參數(shù)和可選參數(shù)可以應(yīng)用在方法、索引器、構(gòu)造函數(shù)和委托。命名參數(shù)和可選參數(shù)與dynamic類型結(jié)合在一起使用,可以方便的訪諸如Office自動(dòng)化API之類的COM API。
1.1 命名參數(shù)
命名參數(shù)的語法為:
參數(shù)名稱1:參數(shù)值1,參數(shù)名稱2:參數(shù)值2…
例如以下代碼:
static void Main(string[] args) { CreateUser(password:"adminpassword",name:"admin"); } |
可以看到由于在調(diào)用時(shí)使用了命名參數(shù),參數(shù)的位置就不在重要了。
1.2. 可選參數(shù)
方法、構(gòu)造函數(shù)、索引器和委托的定義可以指定其參數(shù)為必選的還是可選的,在調(diào)用時(shí)必須提供必選參數(shù),但是可以省略可選參數(shù)。
還可以使用System.Runtime.InteropServices.OptionalAttribute特性類定義可選參數(shù),該類從1.0時(shí)代就已經(jīng)包含在基類庫(kù)中了。
每一個(gè)可選參數(shù)的定義都包含默認(rèn)值(默認(rèn)值必須是常量),如果在調(diào)用時(shí)沒有指定該參數(shù),則使用默認(rèn)值。例如以下代碼:
static void Main(string[] args)
{
CreateUser("admin","adminpassword",50);
}
///
///
用戶名稱
///
用戶密碼
///
積分
///
是否鎖定
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);
而必須寫成:
CreateUser("admin","adminpassword",20,true);、
或者更好的解決辦法是使用命名參數(shù):
CreateUser("admin","adminpassword",isLocked:true);
1.3. COM API訪問
命名和可選參數(shù)與dynamic和其他增強(qiáng)一起使得訪問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)單的寫成這樣:
excelApp.get_Range("A1", "B4").AutoFormat( Format: myFormat ); |
2. 類型等價(jià)支持(Type Equivalence Support)(此段為翻譯)
如果嵌入來自于強(qiáng)命名托管程序集的類型信息時(shí),可以使在某一應(yīng)用程序中的類型與獨(dú)立的發(fā)布版本中類型保持松散的連接。這意味著應(yīng)用程序可以在不需要重新編譯每一個(gè)版本的情況下使用多個(gè)版本托管類庫(kù)中的類型。
類型嵌入經(jīng)常用于COM交互,例如使用Microsoft Office中的自動(dòng)化的應(yīng)用程序。嵌入類型信息允許同一個(gè)應(yīng)用程序在安裝了不同的Office版本的機(jī)器上運(yùn)行。而且開發(fā)人員可以在完全托管解決方案中使用類型嵌入。
來自于某個(gè)程序中可以嵌入的類型需要滿足以下條件:
該程序集至少暴露一個(gè)公共接口。
該嵌入接口使用ComImport和Guid特性聲明
該程序集使用ImportedFromTypeLib和一個(gè)程序集級(jí)別的Guid特性標(biāo)注(默認(rèn)情況下Visual Basic和Visual C#模版已包含了程序集的Guid特性)。
在指定可以嵌入的公共接口后,可以創(chuàng)建實(shí)現(xiàn)了這些接口的類??蛻舳顺绦蚩梢栽谠O(shè)計(jì)時(shí)引用包含了這些公共接口的程序何并且默認(rèn)Embed Interop Types屬性為true以嵌入類型信息(在命令行使用/link編譯開關(guān)可以達(dá)到相同的效果),接下來客戶端可以創(chuàng)建這些接口的實(shí)例。如果您創(chuàng)建了強(qiáng)命名運(yùn)行時(shí)程序集的新版本,客戶端不需要使用新的程序集重新編譯,相反,客戶端程序通過公共接口的嵌入類型信息繼續(xù)使用可用的程序集的版本
2.1. 首先創(chuàng)建一個(gè)強(qiáng)命名接口類庫(kù)(根據(jù)滿足條件設(shè)置屬性)
[ComImport] [Guid("8DA56996-A151-4136-B474-32784559F6DF")] public interface ISampleInterface { void GetUserInput(); string UserInput { get; } } |
2.2. 創(chuàng)建強(qiáng)命名類庫(kù),引用接口類庫(kù)并定義實(shí)現(xiàn)以上接口的類:
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)建客戶端應(yīng)用程序,引用接口并使用反射的方法動(dòng)態(tài)創(chuàng)建類型執(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ào)和文件版本號(hào)為2.0.0.0:
public DateTime GetDate() { return DateTime.Now; } |
5. 再次執(zhí)行客戶端程序,觀察不同(客戶端將輸出新的版本號(hào))。
在.NET全部使用托管代碼創(chuàng)建的程序集自動(dòng)會(huì)識(shí)別更新,也就是說不需要使用額外的屬性定義,直接創(chuàng)建接口、實(shí)現(xiàn)接口類庫(kù)和客戶端類(或者沒有接口直接創(chuàng)建類庫(kù)在客戶端引用),在類庫(kù)更新后復(fù)制到客戶端引用的位置,客戶端會(huì)自動(dòng)檢測(cè)到該更新,這也是.NET程序集為開發(fā)人員帶來的好處。但是使用類型等價(jià)支持的作用體現(xiàn)在什么地方,我認(rèn)為還是方便了COM API的訪問,因?yàn)镃OM可能是使用其他語言編寫的,沒有辦法做到像.NET程序集那樣自動(dòng)感應(yīng)版本變化,個(gè)人意見,期望高手解答。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#中visual studio 2010命名和可選參數(shù)的特性有哪些”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。