-1

私は次の違いは何かを理解しようとしています:

public partial class TestWindow : Window
{
    object obj = new object();
    public TestWindow()
    {
        InitializeComponent();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }
}

と:

public partial class TestWindow : Window
{
    object obj;
    public TestWindow()
    {
        InitializeComponent();
        obj = new object();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }
}

と:

public partial class TestWindow : Window
{
    object obj;
    public TestWindow()
    {
        InitializeComponent();

    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        obj = new object();
    }
}

それらはすべて同じように動作するように見えますが、それらの間に重要な違いがあるのか​​ 、それともそれらの1つを選択するのが「ベストプラクティス」にすぎないのでしょうか。前もって感謝します

4

5 に答える 5

3

あなたの質問に対する答えは、変数を使用する前に変数を初期化する必要があるということです

フィールド初期化子はコンストラクターの前に実行され、コンストラクターは Window_Loaded などの他のメソッドの前に実行されます。オブジェクトを初期化する前に使用しようとすると、NullReferenceException が発生するため、これは重要です。Window_Loaded が呼び出される前にオブジェクトを使用しない場合、違いはありません。

于 2012-04-19T06:56:58.573 に答える
0

宣言時にフィールドを初期化することは、コンストラクターの最初の行で初期化することと同じであるため、

public partial class TestWindow : Window
{
    object obj = new object();
    public TestWindow()
    {
        InitializeComponent();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }
}

これはと同じです

public partial class TestWindow : Window
{
    object obj;
    public TestWindow()
    {
        obj = new object();
        InitializeComponent();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }
}

Window_Loadで初期化すると、オブジェクトはイベントが発生したときにのみ初期化されます...これは発生する可能性があります.

お役に立てれば

于 2012-04-19T06:53:58.523 に答える
0

ここで発生する可能性のある唯一の違いは、プログラム アーキテクチャによって暗示された違いです。初期化する場所は実行フローの問題であるため、メンバーを初期化するのに適した場所を決定する必要があります。それがクラスのグローバル変数であることを考慮すると、その場で初期化できます。objobj

public class TestWindow
{
  object obj = new object();
  public TestWindow()
  {
     ...
  }
}

..または、これが大きなオブジェクトであり、フォームの実行フロー中に使用できない場合は、ユーザーの明示的な要求でのみButtonClick初期化することをお勧めします。

于 2012-04-19T06:54:19.240 に答える
0
public partial class TestWindow : Window
{
    object obj = new object();
    public TestWindow()
    {
        InitializeComponent();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }
}

ここでは、コンストラクターが呼び出される前にオブジェクトが初期化されます。

public partial class TestWindow : Window
{
    object obj;
    public TestWindow()
    {
        InitializeComponent();
        obj = new object();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

    }
}

オブジェクトはコンストラクターで初期化されます。

public partial class TestWindow : Window
{
    object obj;
    public TestWindow()
    {
        InitializeComponent();

    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        obj = new object();
    }
}

window_Loaded が呼び出されると、オブジェクトが初期化されます。

個人的には、コンストラクターが呼び出される前にオブジェクトを初期化することはありません。コードを IOC バージョンにリファクタリングすると、問題が発生する可能性があります。また、メソッドでオブジェクトを初期化する場合、このメソッドより前のメソッドがこのオブジェクトを使用しようとすると、おそらく失敗することに注意してください。一方で、それはあなたが何をしたいかによって異なります。すべての用法は、ある意味で正しいです。

于 2012-04-19T07:01:29.870 に答える
0

範囲に主な違​​いがあります。

最初のケースと同様に、クラスで定義するすべてのメソッドでアクセスできます。つまり、グローバルです。

2 番目と 3 番目のケースでは、関数内で宣言されているため、その関数からのみアクセスできます。

もう 1 つの違いは、1 番目と 2 番目のケースではオブジェクトを作成するときにオブジェクトが宣言され、3 番目のケースでは実際にロードするときに宣言されることです。

お気に入り

TestWindow objTestWindow = new TestWindow(); // will not create object
TestWindow.Show(); // will create an object
于 2012-04-19T07:02:18.963 に答える