欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于C# 4.0新特性“缺省參數(shù)”的實現(xiàn)詳解

 更新時間:2020年06月17日 08:23:39   作者:蔣金楠  
這篇文章主要給大家介紹了關(guān)于C# 4.0新特性“缺省參數(shù)”的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家學習或者使用C# 4.0具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

C#4.0關(guān)于缺省參數(shù)的新特性,相信大家都不會陌生。所謂缺省參數(shù),顧名思義,就是在聲明方法的某個參數(shù)的時候為之指定一個默認值,在調(diào)用該方法的時候如果采用該默認值,你就無須指定該參數(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ù),默認值分別為“Bar”和“Baz”。

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

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

  1: static void Main(string[] args)
  2: {
  3:   TestMethod("Foo");
  4:   TestMethod("Foo", "Bar1");
  5:   TestMethod("Foo", "Bar1", "Baz1");
  6: }

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

   1: Foo   - Bar   - Baz
   2: Foo   - Bar1  - Baz
   3: Foo   - Bar1  - Baz1

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

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

但是,缺省參數(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)。

  1: static void TestMethod(DateTime date = DateTime.Now)
  2: {
  3:  //Others...
  4: }  

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

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

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

  1: [ComVisible(true), AttributeUsage(AttributeTargets.Parameter, Inherited=false)]
  2: public sealed class OptionalAttribute : Attribute
  3: {
  4: }
  5: 
  6: [AttributeUsage(AttributeTargets.Parameter)]
  7: public sealed class DefaultParameterValueAttribute : Attribute
  8: {
  9:   public DefaultParameterValueAttribute(object value);
 10:   public object Value {get; }
 11: }

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

  1: private static void TestMethod(string foo, 
  2:   [Optional, DefaultParameterValue("Bar")] string bar, 
  3:   [Optional, DefaultParameterValue("Baz")] string baz)
  4: {
  5:   //Others..
  6: }

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

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

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

  1: static void Main(string[] args)
  2: {
  3:   TestMethod("Foo");
  4:   TestMethod("Foo","Bar1");
  5:   TestMethod("Foo","Bar1","Baz1");
  6: }
  7: 
  8: private static void TestMethod(string foo, 
  9:   [Optional, DefaultParameterValue("Bar")] string bar, 
 10:   [Optional, DefaultParameterValue("Baz")] string baz)
 11: {
 12:   //Others..
 13: }

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

  1: private static void Main(string[] args)
  2: {
  3:   TestMethod("Foo", "Bar", "Baz");
  4:   TestMethod("Foo", "Bar1", "Baz");
  5:   TestMethod("Foo", "Bar1", "Baz1");
  6: }

雖然說我們通過OptionalAttribute和DefaultParameterValueAttribute 這兩個特性也可以定義缺省參數(shù),但是當我們將缺省參數(shù)定義在普通參數(shù)之前是,編譯器不會報錯。倒是方法中缺省參數(shù)實際上就相當于普通參數(shù)了。

  1: static void Main(string[] args)
  2: {
  3:   //TestMethod("Foo","Baz");
  4:   //上面的方法調(diào)用無效
  5:   TestMethod("Foo","Bar1","Baz1");
  6: }
  7: private static void TestMethod(string foo, 
  8:   [Optional, DefaultParameterValue("Bar")] string bar, 
  9:   string baz)
 10: {
 11:   //Others..
 12: }

總結(jié)

到此這篇關(guān)于C# 4.0新特性“缺省參數(shù)”的實現(xiàn)的文章就介紹到這了,更多相關(guān)C#4.0新特性“缺省參數(shù)”內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WPF實現(xiàn)繪制折線圖的示例代碼

    WPF實現(xiàn)繪制折線圖的示例代碼

    這篇文章主要為大家詳細介紹了如何使用WPF實現(xiàn)繪制簡單的折線圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • 詳解LINQ入門(上篇)

    詳解LINQ入門(上篇)

    這篇文章主要介紹了詳解LINQ入門(上篇),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • C#使用Socket快速判斷數(shù)據(jù)庫連接是否正常的方法

    C#使用Socket快速判斷數(shù)據(jù)庫連接是否正常的方法

    這篇文章主要介紹了C#使用Socket快速判斷數(shù)據(jù)庫連接是否正常的方法,涉及C#中socket操作的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C#訪問SqlServer設(shè)置鏈接超時的方法

    C#訪問SqlServer設(shè)置鏈接超時的方法

    這篇文章主要介紹了C#訪問SqlServer設(shè)置鏈接超時的方法,涉及CommandTimeout屬性的相關(guān)設(shè)置技巧,非常簡單實用,需要的朋友可以參考下
    2015-06-06
  • C#基于winform實現(xiàn)音樂播放器

    C#基于winform實現(xiàn)音樂播放器

    這篇文章主要為大家詳細介紹了C#基于winform實現(xiàn)音樂播放器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C# log4net 日志輸出的實現(xiàn)示例

    C# log4net 日志輸出的實現(xiàn)示例

    本文主要介紹了C# log4net 日志輸出的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 采用C#實現(xiàn)軟件自動更新的方法

    采用C#實現(xiàn)軟件自動更新的方法

    這篇文章主要介紹了采用C#實現(xiàn)軟件自動更新的方法,非常實用的功能,需要的朋友可以參考下
    2014-08-08
  • C# FileStream復制大文件功能

    C# FileStream復制大文件功能

    這篇文章主要為大家詳細介紹了C# FileStream復制大文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C#使用Socket實現(xiàn)本地多人聊天室

    C#使用Socket實現(xiàn)本地多人聊天室

    這篇文章主要為大家詳細介紹了C#使用Socket實現(xiàn)本地多人聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Unity Shader實現(xiàn)動態(tài)霧效果

    Unity Shader實現(xiàn)動態(tài)霧效果

    這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)動態(tài)霧效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論