2012-06-08 57 views
0

我一直在使用API​​來做一些工作。這是我第一次使用它的方式:使客戶新成爲類的成員

var someStuff = new myObject(); 
someStuff.Name = "stackOverflow"; 
someStuff.Options.MaxSurname = 5; //this caused me to get a runtime exception, Options is Null 

修復很簡單。我顯然不得不新增選項成員來創建一個實例。

someStuff.Options = new Options(); 
someStuff.Options.MaxSurname = 5; 

顯然,這現在可以按預期工作。這個可以嗎?作爲一名客戶,我不知道我必須新增此選項成員。一旦我去調試並得到一個運行時空對象異常,快速修復。

回答

0

是的,這沒關係。 出於某種原因,您使用的API需要您構造一個選項對象,並且編譯器無法檢查此(因此運行時異常)。

你也可以把它應用到SomeStuff之前contruct的對象,如果這種感覺更自然的你:

Options someOptions = new Options(); 
someOptions.MaxSurname = 5; 
someStuff.Options = someOptions; 
+0

是的,這就是我現在的做法,讓它看起來更自然。我知道編譯器在這種情況下並不聰明,我只是在想如果有另一種方法來設計這樣的類。即首次使用或類似的構建物。 –

+0

@Science_Fiction:當然,myObject類可以在初始化時構造一個Options對象;或者它可能需要構造函數中的選項參數。這一切都取決於你想限制API的使用。 (正在製作所需的選項對象,例如...) –

+0

設置選項是可選的。所以我想這就是爲什麼它沒有在構造函數中初始化的原因,因爲它可能被認爲毫無意義,因爲沒有人繼續使用它。 –

0

你總是可以使用一個工廠方法。

示例代碼:

public class MyObjectFactory 
{ 
    public static MyObject CreateSomeObject() 
    { 
     return new MyObject() { SomeOptions = new Options(); } 
    } 
} 

// used as ... 
var myObject = MyObjectFactory.CreateSomeObject(); 
myObject.Options.MaxSurNames = 5; 

因此你不能再進去的MyObject的一個不完整的實例。其感覺自然。