2011-10-19 91 views
1

我有一個屬性(字符串)的對象。例如:重量,身高的患者對象。函數檢查空字符串/屬性?

但是,當該屬性爲空時,我嘗試使用它的代碼失敗,因爲該屬性設置爲null。所以我想要做的是創建函數來檢查字符串/屬性是否爲空,如果是,請將該屬性設置爲「」。

我知道我可以做以下其中一種: if(string.isNullOrEmpty(patient.weight))patient.weight =「」;

但我需要的代碼儘可能乾淨,而且我有很多屬性,所以我不想手動檢查每一個。理想情況下,我想有一個可以接受字符串的函數(即使它爲空也不會失敗),並且只返回值(如果不是null)或者返回「」,如果它爲null。

誰能給我一個線索在此:(

+0

難道你不只是初始化字符串爲「」創建對象時? – Gage

回答

5

個人而言,我將確保這些屬性可以永遠爲空通過這樣寫他們:

private string _Name = string.Empty; 
public string Name 
{ 
    get 
    { 
     return _Name; 
    } 
    set 
    { 
     _Name = value ?? string.Empty; 
    } 
} 

但是,你要找什麼可能是??運營商,也被稱爲null-coalescing operator,如上面所用,基本上,此表達式:

x = y ?? z; 

裝置與此相同:

if (y != null) 
    x = y; 
else 
    x = z; 

這也不完全是真的。在上面的例子y是兩次評估,不與??操作發生,所以一個更好的近似會是這樣:

var temp = y; 
if (temp != null) 
    x = temp; 
else 
    x = z; 
+0

嗡嗡聲,沒有人看到(編輯我的問題,並檢查源)爲什麼我的代碼最終被格式化,因爲它是?即。該物業合併在一條線上。 –

+0

通過在大括號'{'和'}'之前不插入EOL來修復它。 – Otiel

+0

雖然這可能不會在一條線上組合,但這不是一個解決方案。在今天的代碼降價處理中是否存在一個錯誤? –

2

null coalescing operator聽起來好像這是你的朋友在這裏:

string text = patient.Name ?? ""; 

可以編寫擴展方法做同樣的事情,但我認爲運營商可能最終會變得更具可讀性。

請注意,這不會設置屬性 - 但這不是你說你想要的無論如何,在句子中:

理想情況下,我想有一個函數,可以接受字符串,(即使它是空的也不會失敗),並簡單地返回值(如果它不爲空)如果它是空的,則爲「」。

這正是上面的代碼所做的。

2

是這樣的嗎?

public string EmptyIfNull(string value) 
{ 
    return value ?? String.Empty; 
} 
+0

這樣做......非常感謝大家! –

2

使用空合併運算符:

string s = Patient.Name ?? string.Empty; 

所以,如果Patient.Name爲null,則s將被設置爲空字符串。

2

你可以做myString ?? string.Empty,它給你的字符串,或者string.Empty,如果它是空的。

1

可以使用?? operator來回報您選擇的默認值時,任何對象爲空。

string a = null; 
a = a ?? "womble"; 
// a now has the value "womble" 

string b = "fluff"; 
b = b ?? "cabbage"; 
// b wasn't null, so it still has the value "fluff" 
0

如果重量高度是整數,他們不能爲空。如果你的對象是null而你試圖獲得高度重量的空對象,那麼你的代碼是完全錯誤的。如果一個字符串爲null,那麼它將打印一個空字符。

以下是非常優雅:

if (String.isNullOrEmpty(patient.weight)) 
{ 
//DO STUFF HERE 
} 
else 
{ 
//DO OTHER STUFF HERE 
} 

請明白,如果病人爲空,你甚至不應該在這個代碼塊。

如果您使用的是isNullOrEmpty那麼執行以下操作就毫無意義。

patient.weight = ""; 

作者注

我想我不明白一個字符爲空將會導致問題的原因。初始化時將值設置爲空字符串的要點當然是有效的。

1

我不確定你在問什麼是最適合你的解決方案。如果每次您不想檢查String並返回""如果它是null,我建議您將String字段初始化爲""

private String height = ""; 

代替

private String height; 

順便說一句,你應該存儲值像heightweightDouble而不是String,除非你有一個很好的理由不這樣做。

0

你可以從@Jon的想法更進一步,所以你不必擔心使用??無處不在:

定義你的訪問方法是這樣的:

private String m_name = null; 
public String Name 
{ 
    get { return m_name ?? String.Empty; } 
    set { m_name = value; } 
} 

您存取Name屬性將執行空合併運算符爲您服務。