2016-12-09 40 views
0

好吧,所以我是C Sharp的新手,我有一個可能發送空值的函數調用。我想確保如果它爲空,那麼我應該將那些空值設置爲空字符串。以下是我嘗試過的方法,但我認爲必須有一種優雅的方式來實現這一點。當空值傳遞時如何設置空字符串

public static Concat() 
{ 
     // imagine x = null and y = null 
     Abc(x, y); 
} 

public static Abc (string x , string y) 
{ 
     // blah blah 
     x = x ?? ""; 
     y = y ?? ""; 
     efg(x, y); 
} 

我看着這個Solution,但我無法理解它。我可以在Abc arguments/parameter本身做些什麼嗎?我的意思是

public static Abc (string x Can I do something here , string y Can I do something here) 
    { 
      // blah blah 
      x = x ?? ""; 
      y = y ?? ""; 
      efg(x, y); 
    } 
+0

不,你不能按照定義。如果你允許傳遞'string'(而'null'是一個字符串的有效值),那麼可以將null作爲參數值傳遞。你的示例代碼片段可以做到這一點:'x = x ?? 「」;''可以被讀爲「set x = x如果x不爲空,但是如果它爲空,則將其設置爲空字符串 – SlimsGhost

+0

或者你可以通過簡單地使用」efg(x ??「」, y「」「);」 – SlimsGhost

+0

C#不支持不可爲空的引用類型,假設它有hadm,那麼你的方法可能看起來像'public static Abc(string!x,string!y)',其中感嘆號這意味着編譯器保證它們不會爲null。有關未來C#特性的一些相關建議,請參閱例如[Proposal:Nullable reference types and nullability checking](https://github.com/dotnet/roslyn/issues/5032) –

回答

5

我覺得必須有一個優雅的方式來實現這一目標。

有:??運營商。你找到了。對你很好。

Abc (string x Can I do something here

你可以說

public static Abc(string x = "", string y = "") 

,現在你可以把它叫做

Abc("a", "b); 
Abc("a"); // actually calls Abc("a", "") 
Abc(); // actually calls Abc("", "") 

但是當空在傳遞這不會改變的行爲。它允許您省略參數,而不會更改空參數的值。

+0

實際上我正在處理的原始項目中有同樣的東西'public static Abc(string x =「」,string y =「」)''但是由於空值,我在我的數據庫中發現了問題。你告訴我一件事,如果我保留'public static Abc(string x =「」,string y =「」)'這是否使x和y成爲可選參數。我的意思是我可以簡單地調用'Abc()',它仍然可以正常工作? – Unbreakable

0

不幸的是,C#本身不支持編譯時檢查,以在引用類型上執行非空值,包括string

您可以提供默認值,例如void DoSomething(string x = ""),但是這並不妨礙某人用空值重寫它。

+0

由於'字符串。Empty'不是'const',它不是編譯時常量,不能用於默認值。你可以定義你自己的'const'並使用它,或者你可以使用''「''',也就是'void DoSomething(string x =」「)''。 –

+0

我的壞!更新了答案 – Bas

0

小的改進:

public static Abc (string x , string y) => efg(x ?? "", y ?? ""); 

沒有太大的不同,你已經有。如果someObject不是null,則?運營商(如在someObject?.SomeProperty中)返回值SomeProperty。這不適用於你的例子。

相關問題