日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

“.NET研究”谈谈C# 4.0新特性“缺省参数”的实现

發(fā)布時間:2025/3/8 C# 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “.NET研究”谈谈C# 4.0新特性“缺省参数”的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  C#4.0關(guān)于缺省參數(shù)的新特性,相信大家都不會陌生。所謂缺省參數(shù),顧名思義,就是在聲明方法的某個參數(shù)的時候為之指定一個默認(rèn)值,在調(diào)用該方法的時候如果采用該默認(rèn)值,你就無須指定該參數(shù)。和很多語言層面特性(語法糖)的實現(xiàn)一樣,缺省參數(shù)也是編譯器為我們玩的一個小花招。缺省參數(shù)最終體現(xiàn)為兩個特殊的自定義特性O(shè)ptionalAttribute和DefaultParameterValueAttribute 。

目錄
一、缺省參數(shù)的用法
二、實現(xiàn)缺省參數(shù)的兩個特性:OptionalAttribute和DefaultParameterValueAttribute
三、直接通過OptionalAttribute和DefaultParameterValueAttribute 定義缺省參數(shù)

  一、缺省參數(shù)的用法

  比如下面一個TestMethod方法,后面兩個參數(shù)bar和baz就是缺省參數(shù),默認(rèn)值分別為“Bar”和“Baz”。

static void TestMethod(string foo, string bar = "Bar", string baz = "Baz")
{
Console.WriteLine(
"{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
}

  在調(diào)用TestMethod的時候,我們自由地選擇采用缺省的參數(shù)值,或者覆蓋該缺省值。

static void Main(string[] args)
{
TestMethod(
"Foo");
TestMethod(
"Foo", "Bar1");
TestMethod(
"Foo", "Bar1", "Baz1");
}

  下面是輸出結(jié)果:

Foo - Bar - Baz
Foo
- Bar1 - Baz
Foo
- Bar1 - Baz1

  缺省參數(shù)的使用有兩個簡單的限制,其一是:缺省參數(shù)的聲明只能放在普通參數(shù)之后。如下代碼中定義的TestMethod方法中,缺省參數(shù)bar后面跟一個非缺省參數(shù)baz,這樣的代碼是不能通過編譯的(編譯錯誤信息為:Optional parameters must appear after all required parameters)。

上海徐匯企業(yè)網(wǎng)站設(shè)計與制作> static void TestMethod(string foo, string bar = "Bar", string baz)
{
Console.WriteLine(
"{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
}

  但是,缺省參數(shù)后面可以跟數(shù)組參數(shù)(params參數(shù)),實際上無論在什么情況下,params參數(shù)都只能是最后一個聲明的參數(shù)。關(guān)于缺省參數(shù)的聲明的位置限制,主要重載方法的識別機制決定的,這一點大家都很容易理解。

  缺省參數(shù)的另一個限制是:指定的缺省值必須是一個常量,這就實際上為作為缺省參數(shù)的數(shù)據(jù)類型作了限制——只能是系統(tǒng)定義的基元類型。下面定義的TestMethod方法中,我們定義了一個DateTime類型的缺省參數(shù),并將參數(shù)缺省值作為DateTime.Now。由于DateTime.Now不是常量,所以這樣的代碼也不能通過編譯(編譯錯誤消息:Default parameter value for 'date' must be a compile-time constant)。

static void TestMethod(DateTime date = DateTime.Now)
{
//Others...
}

  二、實現(xiàn)缺省參數(shù)的兩個特性:OptionalAttribute和DefaultParameterValueAttribute

  為什么缺省參數(shù)的默認(rèn)值只能接受常量呢?如果你了解了缺省參數(shù)的本質(zhì),這就不是一個問題。那么缺省參數(shù)究竟是如何實現(xiàn)的呢?

  和很多語言層面特性(語法糖)的實現(xiàn)一樣,缺省參數(shù)也是編譯器為我們玩的一個小花招,而真正編譯后的東西都是我們再熟悉不過的玩意兒。當(dāng)包含缺省參數(shù)的C#代碼經(jīng)過編譯后,缺省參數(shù)體現(xiàn)在兩個特殊的自定義特性O(shè)ptionalAttribute和DefaultParameterValueAttribute 。前者將參數(shù)標(biāo)識為缺省參數(shù),后者指定其缺省值。

[ComVisible(true), AttributeUsage(AttributeTargets.Parameter, Inherited=false)]
public sealed class OptionalAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Parameter)]
public sealed class DefaultParameterValueAttribute : Attribute
{
public DefaultParameterValueAttribute(object value);
public object Value {get; }
}

  對于最開始我們定義的TestMethod方法,編譯后的形式如下所示。

private static void TestMethod(string foo,
[Optional, DefaultParameterValue(
"Bar")] string bar,
[Optional, DefaultParameterValue(
"Baz")] strin上海閔行企業(yè)網(wǎng)站設(shè)計與制作g baz)
{
//Others..
}

  正是因為缺省參數(shù)的默認(rèn)值最終是作為DefaultParameterValueAttribute的參數(shù)存在的,所以它必須是常量。

  三、直接通過OptionalAttribute和DefaultParameterValueAttribute 定義缺省參數(shù)

  既然缺省參數(shù)最終體現(xiàn)為OptionalAttribute和DefaultParameterValueAttribute 這兩個特性,我們是否可以直接通過它們來定義缺省參數(shù)呢?答案是:當(dāng)然可以,下面的代碼一樣可以正常執(zhí)行。

static void Main(string[] args)
{
TestMethod(
"Foo");
TestMethod(
"Foo","Bar1");
TestMethod(
"Foo","Bar1","Baz1");
}

private static void TestMethod(string foo,
[Optional, DefaultParameterValue(
"Bar")] string bar,
[Optional, DefaultParameterValue(
"Baz")] string baz)
{
//Others..
}

  如果調(diào)用含有缺省參數(shù)的方法,并且沒有顯示指定該參數(shù),編譯器在編譯的時候會自動將默認(rèn)值附加上去。對于上面的Main方法,下面是與之等效的編譯后代碼。

private static void Main(string[] args)
{
TestMethod(
"Foo", "Bar", "Baz");
TestMethod(
"Foo", "Bar1", "Baz");
TestMethod(
"Foo", "Bar1", "Baz1");
}

  雖然說我們通過OptionalAttribute和DefaultParameterValueAttribute 這兩個特性也可上海企業(yè)網(wǎng)站設(shè)計與制作以定義缺省參數(shù),但是當(dāng)我們將缺省參數(shù)定義在普通參數(shù)之前是,編譯器不會報錯。倒是方法中缺省參數(shù)實際上就相當(dāng)于普通參數(shù)了。

static void Main(string[] args)
{
//TestMethod("Foo","Baz");
//上面的方法調(diào)用無效
TestMethod("Foo","Bar1","Baz1上海徐匯企業(yè)網(wǎng)站制作style='color:white;' href='http://www.93tj.com'>上海網(wǎng)站建設(shè)"color: #800000;">");
}
private static void TestMethod(string foo,
[Optional, DefaultParameterValue(
"Bar")] string bar,
string baz)
{
//Others..
}

總結(jié)

以上是生活随笔為你收集整理的“.NET研究”谈谈C# 4.0新特性“缺省参数”的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。