2009-04-17 34 views
4

我正在尋找一種很好的方法來處理對象層級中的空引用。處理對象層級中的空引用的更好方法

即:

if(null == Object1.Object2.Object3.Property) 

這個例子,如果說是Object2的空將拋出一個空引用異常。

在我的情況下,我不在乎什麼是空,只是有些事情。 我並不是真的想在每個我想要做這樣的事情的地方都嘗試/捕捉,所以我一直在尋找替代品。

我已經試驗過?但是這會在兩個級別之後產生一些醜陋的代碼。

任何想法讚賞。

回答

6

現在這可能是一個切線...但我會建議一個設計更改,以避免醜陋和疼痛

調用Object1.Object2.Object3.Property違反law of demeter。相反,如果你應該去那個屬性,Object1應該公開一個屬性本身...所以你應該叫Object1.RetrievedFromTheDepthsProperty
爲什麼這是必要的..是,如果類型Object2的設計器更改返回的對象的類型通過'Object3'字段/屬性找到一個沒有你正在尋找的屬性的對象,你會被洗掉。客戶對Object1的內部結構知之甚多。如果將Object1封裝在數據位於內部的位置,則可以避免將來的更改。另外這個屬性可以做所有的空按照要求在內部檢查......讓你用更清潔

if (Object1.RetrievedFromTheDepthsProperty == null) {...} 
2

這個(無效的解除引用)是偶爾會引發的事情,而不是;沒有令人滿意的答案,此刻,除了:

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) 

在一般情況下,我會建議對上述情況,除非你真的,真的不想兩次致電屬性(因爲它做的比物業應該更多的工作)

0

一般來說,如果你不在乎你的哪個屬性爲null對象層次結構不要對它進行測試。爲應用程序使用全局錯誤處理程序(這取決於應用程序ASP.NET,WinForms,...的類型),並說用戶出了問題。

1

不能直接回答你的問題 - 只是一些提示:

  • 嘗試使用Null object
  • 它只是似乎並不適合在層次結構這一步(您三級)去的,也許一些方法將回答條件的第一個/第二個級別將幫助
2

您可以使用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並忘記檢查它,代碼往往會很快炸燬,但是一個「空對象」可以更容易地深入到調用堆棧中,並且由於它不是一個真正的對象,所以會導致一些細微的問題。

+0

你確實需要注意正確的地方來使用它(想想你在做什麼),但是據我所知,這種模式 - 也被稱爲哨兵模式? - 可以成爲真正的生活救星。我喜歡它,只要它增加它的重量就可以使用它,可以這麼說。 – peSHIr 2009-04-17 08:12:23

相關問題