假設我要檢查組對象,以確保沒有爲空:我可以在方法調用中強制自己的短路嗎?
if (obj != null &&
obj.Parameters != null &&
obj.Parameters.UserSettings != null) {
// do something with obj.Parameters.UserSettings
}
這是一個誘人的前景寫一個輔助函數來接受可變數量的參數,並簡化這種檢查:
static bool NoNulls(params object[] objects) {
for (int i = 0; i < objects.Length; i++)
if (objects[i] == null) return false;
return true;
}
接着上面的代碼將變成:
if (NoNulls(obj, obj.Parameters, obj.Parameters.UserSettings)) {
// do something
}
,對嗎? 錯誤。如果obj
爲空,那麼當我嘗試將obj.Parameters
傳遞給NoNulls
時,我會得到NullReferenceException
。
所以上述方法顯然是錯誤的。但if
聲明使用&&
運算符工作得很好,因爲它是短路的。所以:是否有任何方法使方法短路,以便它的參數不被評估,直到在方法中明確引用?
你真正需要解決這個問題並不是懶惰的方法論證評估 - 儘管如你所見,這可以做到這一點。最好是運算符x.?y具有(x == null?null:x.y)的語義 - 這樣你可以說「if(obj.?Parameters.?UserSettings == null)」。我們考慮過C#4的這樣一個運算符,但從未實現它。也許對於假設的未來版本。 – 2009-12-16 20:59:00
這真的很有趣。有沒有其他語言實現等效的運算符? – 2009-12-16 21:08:14
@Chris:Groovy呢。它被稱爲無效的解除引用操作符。很高興聽到C#團隊考慮到它並可能再次考慮它:) – 2009-12-16 21:21:35