2010-10-12 101 views
47

我可以在C#中給出默認參數嗎?我可以給C#函數中的參數或可選參數提供默認值嗎?

在C:

void fun(int i = 1) 
{ 
    printf("%d", i); 
} 

我們能給參數的默認值?在C#中可能嗎?如果是這樣,我們可以避免重載功能?

將可選參數添加到現有函數總是一個不好的做法。如果您正在處理一個項目,該項目不得不引用具有函數的類,並且我們使用可選值更改了參數,則可能會拋出未找到該方法的運行時異常。

這是因爲我們會考慮如果我們添加一個額外的可選值,如果函數在很多地方使用,則不需要更改代碼。

function Add(int a, int b); 

這將採用這種方式被稱爲:

Add(10, 10); 

但是如果增加這樣一個可選的參數,

function Add(int a, int b, int c = 0); 

那麼編譯器預計

Add(10, 10, 0); 

其實我們在打電話像這樣Add(10, 10),這個函數在這個類中將不可用,並導致運行時異常。

這種情況發生在向一個被很多地方調用的函數添加一個新參數時,我不確定每次都會發生這種情況。但我建議你重載這個函數。

總是需要重載具有可選參數的方法。另外,如果您正在處理具有多個可選參數的函數,則最好使用參數的名稱傳遞該值。

function Add(int a, int b, int c = 0); 

使用以下方法調用此函數總是很好。

Add(10, 20, c:30); 
+1

你試過了嗎? – 2010-10-12 12:51:38

+1

這是C++,而不是C. – leppie 2010-10-12 13:01:34

+0

你在問什麼? .. – 2011-02-10 07:01:40

回答

55

這正是你如何在C#中這樣做,但先加入該功能在.NET 4.0中

+2

它可以在.NET 3.5中使用 – 2014-07-24 19:47:21

+0

'Visual Studio 2010 +'具有帶'multitargeting'功能的'msbuild'(https://msdn.microsoft.com/en-us/library/vstudio/ee395432(v= VS.100)的.aspx)。它可以使用'.NET 4.0'的Target包來將可選參數構建成一堆重載方法。 – dbardakov 2015-07-29 11:21:43

+0

內聯方法(Func,Action,delegate)呢? – EricG 2017-10-25 11:28:50

5

是的,但你需要使用.NET 3.5和C#4.0中得到這個功能。

This MSDN page有更多信息。

26

是的。見Named and Optional Arguments。請注意,默認值必須是恆定的,所以這是確定:

public string Foo(string myParam = "default value") // constant, OK 
{ 
} 

但這不是:

public void Bar(string myParam = Foo()) // not a constant, not OK 
{ 
} 
0

這是C#4.0的功能,但不可能不使用功能在該版本之前超載。

26

它只能從C#4開始。0

然而,當你使用一個版本的C#,之前4.0,您可以解決此通過使用重載的方法:

public void Func(int i, int j) 
{ 
    Console.WriteLine (String.Format ("i = {0}, j = {1}", i, j)); 
} 

public void Func(int i) 
{ 
    Func (i, 4); 
} 

public void Func() 
{ 
    Func (5); 
} 

(或者,你可以升級到C#4.0 offcourse)。

1

此功能可從C#4.0獲得 - 它是在Visual Studio 2010中引入的。您可以在.NET 3.5的項目中使用它。因此,不需要將.NET 3.5中的舊項目升級到.NET 4.0。

你必須只使用Visual Studio 2010,但要記住,它應該編譯爲默認語言版本(設置在項目屬性 - > Buid->高級...)

This MSDN page大約有可選參數的詳細信息在VS 2010.

相關問題