我正在尋找一種很好的方法來處理對象層級中的空引用。處理對象層級中的空引用的更好方法
即:
if(null == Object1.Object2.Object3.Property)
這個例子,如果說是Object2的空將拋出一個空引用異常。
在我的情況下,我不在乎什麼是空,只是有些事情。 我並不是真的想在每個我想要做這樣的事情的地方都嘗試/捕捉,所以我一直在尋找替代品。
我已經試驗過?但是這會在兩個級別之後產生一些醜陋的代碼。
任何想法讚賞。
我正在尋找一種很好的方法來處理對象層級中的空引用。處理對象層級中的空引用的更好方法
即:
if(null == Object1.Object2.Object3.Property)
這個例子,如果說是Object2的空將拋出一個空引用異常。
在我的情況下,我不在乎什麼是空,只是有些事情。 我並不是真的想在每個我想要做這樣的事情的地方都嘗試/捕捉,所以我一直在尋找替代品。
我已經試驗過?但是這會在兩個級別之後產生一些醜陋的代碼。
任何想法讚賞。
現在這可能是一個切線...但我會建議一個設計更改,以避免醜陋和疼痛
調用Object1.Object2.Object3.Property
違反law of demeter。相反,如果你應該去那個屬性,Object1應該公開一個屬性本身...所以你應該叫Object1.RetrievedFromTheDepthsProperty
爲什麼這是必要的..是,如果類型Object2的設計器更改返回的對象的類型通過'Object3'字段/屬性找到一個沒有你正在尋找的屬性的對象,你會被洗掉。客戶對Object1的內部結構知之甚多。如果將Object1封裝在數據位於內部的位置,則可以避免將來的更改。另外這個屬性可以做所有的空按照要求在內部檢查......讓你用更清潔
if (Object1.RetrievedFromTheDepthsProperty == null) {...}
這個(無效的解除引用)是偶爾會引發的事情,而不是;沒有令人滿意的答案,此刻,除了:
if(Object1 == null || Object1.Object2 == null
|| Object1.Object2.Object3 == null
|| Object1.Object2.Object3.Property == null)
你可以,如果你需要(通過引入變量)做一些輕微的緩存但是會變得醜陋:
SomeType2 obj2;
SomeType3 obj3;
if(Object1 == null || (obj2 = Object1.Object2) == null
|| (obj3 = obj2.Object3) == null
|| obj3.Property == null)
在一般情況下,我會建議對上述情況,除非你真的,真的不想兩次致電屬性(因爲它做的比物業應該更多的工作)
一般來說,如果你不在乎你的哪個屬性爲null對象層次結構不要對它進行測試。爲應用程序使用全局錯誤處理程序(這取決於應用程序ASP.NET,WinForms,...的類型),並說用戶出了問題。
不能直接回答你的問題 - 只是一些提示:
您可以使用Null Object pattern。
class Car {
Engine engine = null;
public Engine Engine {
get {
return engine ?? new NullEngine();
}
}
}
class Engine {
string make;
public virtual string Make { get { return make; } }
}
class NullEngine : Engine {
public override string Make { get { return null; } }
}
然後,你可以這樣做:
Car car;
if (car.Engine.Make != null) Console.WriteLine(car.Engine.Make);
相反的:
Car car;
if (car.Engine != null && car.Engine.Make != null) Console.WriteLine(car.Engine.Make);
請注意,這是一個相當大量的工作來界定 「空對象」 爲您的整個模型。您還需要非常小心,以免混淆模型的用戶。如果你傳遞null並忘記檢查它,代碼往往會很快炸燬,但是一個「空對象」可以更容易地深入到調用堆棧中,並且由於它不是一個真正的對象,所以會導致一些細微的問題。
我強烈建議你看看下面的帖子: http://www.hardcodet.net/2008/12/observe-dependencies-through-lambda-expressions-part1
它是指一個類似的問題,並且還允許您輕鬆處理更改。
你確實需要注意正確的地方來使用它(想想你在做什麼),但是據我所知,這種模式 - 也被稱爲哨兵模式? - 可以成爲真正的生活救星。我喜歡它,只要它增加它的重量就可以使用它,可以這麼說。 – peSHIr 2009-04-17 08:12:23