2016-11-14 7 views
0

新しいオブジェクトFooが作成されると、コンストラクタはオブジェクトプロパティに基づいて新しいフォルダと新しいファイルを作成することになっています。しかし、私はNullException (param: path2)を得ますか?コンストラクタでプロパティ値を持つ新しいオブジェクトを作成します。Null

コンストラクタが呼び出されたときに、オブジェクトプロパティの値がNullであることがわかりました。しかし、私はオブジェクトを作成したときにプロパティ値を与えましたか?私は何が欠けていますか?

私の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); 
    } 
} 

// 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-do-i-fix -it) – Dmitry

+4

この構文では、コンストラクターはプロパティが割り当てられる前に*実行されます。あなたがコンストラクタのボディでそれらを使用しているので、あなたは不運です。たぶんそれらの代わりにコンストラクタ引数を作るでしょうか? –

+2

可能な複製http://stackoverflow.com/questions/17327266/constructor-vs-object-initializer-precedence-in-c-sharp - コンストラクタとオブジェクト初期化子の優先順位はC# – KMoussa

答えて

8

しかし、私は、オブジェクトを作成したとき、私はプロパティの値を与えましたか?

いいえ。 (文法の初心者であれば、直感的ではないかもしれませんが)

コードでは、ののコードが提供される予定です。しかし、あなたはパラメータなしのコンストラクタを持つ:

public Foo() 
{ 
    //... 
} 

そのコンストラクタがこれらのプロパティを設定し、そのデフォルト値を持たれていなかったので、実行されます。

new Foo("corge", "grault") 

あなたがここに何をやっている:

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

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

そしてコンストラクタにそれらを供給:

は、コンストラクタ自体にパラメータを追加します。

これに相当するもの:

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

パラメータが設定される前に、コンストラクタが最初に呼び出されています。

関連する問題