簡體   English   中英

C#默認參數解決方法

[英]C# default parameters workaround

是否有默認參數的解決方法? 在C ++中我會用

int foo(int k, bool check = false)

一個繁瑣的解決方法是重載一個函數。 一個更容易? (沒有辦法只添加變量並檢查函數的調用!!)

謝謝,孫

C#(4.0之前)不支持默認參數。 即使在c#4.0中,默認參數也有點不同於C ++ - 它們存儲在元數據中,當您使用默認參數引用程序集時,它們會被編譯到您的代碼中。 因此,如果將來更改默認值,您的代碼仍將傳遞OLD默認值,這可能會導致不良影響。 因此,使用帶有單個參數和雙參數的重載函數,並調用具有更多參數的參數傳遞默認值。 這種方法的副作用最小。

在C#4中,您也可以這樣做。 所以這是允許的:

int foo(int k, bool check = false){
  ...
}

在C#4中也可以使用命名參數,因此您可以通過多種不同方式調用此方法:

foo(10, true);
foo(10);
foo(k: 10, check: true);
foo(check: true, k: 10);

如果你有幾個可選參數,並且只想指定其中一個不是第一個可選參數,或者提高調用端的可讀性,則命名參數很有用。

在C#4.0中,現在支持默認和命名參數。

http://msdn.microsoft.com/en-us/library/dd264739.aspx

如果使用MSBuild 4.0(VS2010)構建,則可以在程序集中使用可選參數,即使您的目標是.Net 2.0框架。

語法就像你說的那樣:

int foo(int k, bool check = false)
{
}

要詳細說明Denis Mazourick關於在C#4.0中使用 默認 可選參數以及如何將默認值編譯到使用類中的答案,請嘗試此操作。

使用以下代碼創建一個類庫並構建它:

public class ClassWithDefaultParameters {
    public string Msg { get; set; }

    public ClassWithDefaultParameters(string msg = "Hello World") {
        Msg = msg;
    }
}

public class ClassWithConstructorOverloads {
    public string Msg { get; set; }

    public ClassWithConstructorOverloads(string msg) {
        Msg = msg;
    }

    public ClassWithConstructorOverloads() : this("Hello World") {}
}

現在創建一個控制台應用程序並引用剛剛構建的dll(不是項目,而是實際的dll)。 將其放在代碼中並構建控制台應用程序。

    static void Main() {
        var cwdp = new ClassWithDefaultParameters();
        var cwco = new ClassWithConstructorOverloads();

        Console.WriteLine(cwdp.Msg);
        Console.WriteLine(cwco.Msg);
   }

運行應用程序時,輸出將如您所願:

Hello World
Hello World

現在打開類庫,並在“Hello Europe”中更改“Hello World”。 重新編譯庫並將dll復制到控制台應用程序的輸出文件夾中。 不要重建控制台應用程序。

再次運行控制台應用程序時,輸出將是:

Hello World
Hello Europe

可能不是你的預期! 直到重建控制台應用程序,兩行才會打印Hello Europe


我不知道這個,我想我不會因為這個而使用默認參數。 更糟糕的是,微軟在MSDN頁面上沒有提到這一點。

好吧,沒有更簡單的方法,你可以使用param功能,但它也有風險。

看一下string.Format()例子,你可以在其中使用它:

stringA.Format("{0} is {1}", str1, str2)

這樣你可以傳遞任意數量的參數,但是如何使用它並且非常容易出錯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM