2017-12-17 7 views
-2

私は自分の興味のためにダミーのエクササイズを作成しようとしています。 2つのテキストボックス(textBox1、textBox2)とボタンを持つ1つのフォーム(form1)があります。メソッドに渡されたオブジェクトは、C#のリファレンスを保持していません

ボタンをクリックすると、テキストボックスに渡された数値を追加します。 私は、インターフェイス(ICalculate)とインターフェイス(インターフェイス)を実装するクラス(計算)を行うための適切なメソッドのシグネチャを持つインターフェイスを導入することで、物事を複雑にしようとしています。

次に、Calcという別のクラスがForm1からICalculateオブジェクトと2つの整数(a、b)をそのコンストラクタに渡して開始されます。 さらに、Calcクラスには、ICalculateオブジェクトと、クラスのコンストラクタでインスタンス化された2つの整数を使用して、メッセージボックスに結果を表示する2つの整数を追加するメソッド(addition())があります。 (オブジェクト参照オブジェクトのインスタンスに設定されていない)

問題は、コンパイラはICalculateオブジェクトが初期化されていないというエラーをスローすることである

コードは、以下である:

public interface ICalculate 
    { 
    int add(int x, int y); 
    int sub(int x, int y); 
    } 

class Calculations : ICalculate 
    { 

    public int add(int a, int b) 
     { 
     return (a + b); 
     } 
    public int sub(int z, int k) 
     { 
     return (z - k); 
     } 
    } 

class Calc 
    { 

    private ICalculate _nc; 
    private int _x, _y; 

    public Calc(ICalculate nc, int a, int b) 
     { 
     var _nc = nc; 
     _x = a; 
     _y = b; 

     } 
    public void addition() 
     { 
     MessageBox.Show(_nc.add(_x, _y).ToString()); 
     } 
    } 
} 

Form1のコードは以下の通りです:

 public Form1() 
     { 
     InitializeComponent(); 
     } 

    private void button1_Click(object sender, EventArgs e) 
     { 
     var a = Int32.Parse(textBox1.Text); 
     var b = Int32.Parse(textBox2.Text); 

     var c = new Calc(new Calculations(), a, b); 
     c.addition(); 
     } 
    } 

すべてのヘルプ感謝します!

+1

'をVAR _nc = NC;'何が起こるかをテストするだけですか?既に_ncを宣言しているので、varなしで試してみましょう。デバッガを使ってコードを実行してください。 – Grantly

+0

"自分の興味のためにダミーのエクササイズをしようとしています。いいえ、私はあなたがいるとは思わない。 –

+0

[NullReferenceExceptionとは何か、それを修正するにはどうすればいいですか?](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) ) – Plutonix

答えて

3

問題はCalcクラスのコンストラクタにあります。
具体的には、この行:あなたは削除する必要があります

var _nc = nc; 

var

_nc = nc; 
で何が起こる

、あなたはあなたが実際にコンストラクタで_ncというローカル変数を作成しているvarキーワードを持っていたら、 ncの値を代入すると、_ncというクラスメンバーは決して初期化されません。

(VS 2013上でテスト)コンパイラは、このための警告を発行すべきである:あなたがVARを追加しました

Field '<your namespace here>.Calc._nc' is never assigned to, and will always have its default value null

+0

コンパイラはこれについて警告しますか? – Grantly

+0

警告があり、現在の内容をテストするだけで...すぐに私の答えを編集します –

+0

おかげで、ちょっと好奇心が..... ..... NETはしばしば同じ関数の複数の宣言について警告します...クラスコンストラクタメンバーは – Grantly

関連する問題