2016-11-14 72 views
0

創建類Foo的新對象時,構造函數應根據對象屬性創建新文件夾和新文件。但我得到NullException (param: path2)C#在構造函數中使用屬性值創建新對象return Null

當調用構造函數時,我發現對象屬性有Null值。但是當我創建對象時,我給出了屬性值?我錯過了什麼?

// Create a new Foo object with following property values 
Foo foo = new Foo { Baz = "corge", Bar = "grault" }; 
+1

可能重複[什麼是NullReferenceException,以及如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix -it) – Dmitry

+4

使用該語法,構造函數在屬性分配給之前運行*。既然你在構造函數的正文中使用了它們,那麼你倒黴了。也許讓他們構造函數參數呢? –

+2

可能的重複http://stackoverflow.com/questions/17327266/constructor-vs-object-initializer-precedence-in-c-sharp - 構造函數與對象初始值設定項在C#中的優先順序 – KMoussa

回答

8

但我給的屬性值,當我創建的對象:

我的Foo類:

public class Foo 
{ 
    public string Bar { get; set; } 
    public string Baz { get; set; } 
    public string Source { get { return Path.Combine(Qux, Baz, Bar); } } 
    private string Qux { get { return Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); } } 

    public Foo() 
    { 
     // Use property values to find or create Directory and File 
     if (!Directory.Exists(Path.Combine(Qux, Baz))) Directory.CreateDirectory(Path.Combine(Qux, Baz)); 
     if (!File.Exists(Source)) File.Create(Source); 
    } 
} 

在我的主類?

不,你沒有。 (雖然可以肯定的是,如果你不熟悉語法,它可能有點不直觀。)

代碼期望在構造函數中提供那些代碼。但你有一個無參數的構造函數:

public Foo() 
{ 
    //... 
} 

所以,當構造函數執行那些屬性尚未設置,並有其默認值。

的參數添加到構造函數本身:

public Foo(string baz, string bar) 
{ 
    Baz = baz; 
    Bar = bar; 
    //... 
} 

,然後將它們提供給構造函數:

new Foo("corge", "grault") 

,你在這裏做什麼:

Foo foo = new Foo { Baz = "corge", Bar = "grault" }; 

與此相當:

Foo foo = new Foo(); 
foo.Baz = "corge"; 
foo.Bar = "grault"; 

構造函數在參數設置前先被調用。

相關問題