Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象传递给在C中不维护引用的方法#_C# - Fatal编程技术网

C# 对象传递给在C中不维护引用的方法#

C# 对象传递给在C中不维护引用的方法#,c#,C#,为了我自己的兴趣,我正试图做一个模拟练习。 我有一个表单(form1),有两个文本框(textBox1,textBox2)和一个按钮 当我单击按钮时,我想添加传递到文本框的数字。 现在,我试图通过引入一个接口和一个实现该接口的类(计算),该接口带有执行加法(ICalculate)的适当方法的签名,从而使事情复杂化 然后,我有另一个名为Calc的类,它从Form1开始,通过在构造函数中传递一个ICalculate对象和2个整数(a,b)。 此外,Calc类有一个方法(addition())用于使用

为了我自己的兴趣,我正试图做一个模拟练习。 我有一个表单(form1),有两个文本框(textBox1,textBox2)和一个按钮

当我单击按钮时,我想添加传递到文本框的数字。 现在,我试图通过引入一个接口和一个实现该接口的类(计算),该接口带有执行加法(ICalculate)的适当方法的签名,从而使事情复杂化

然后,我有另一个名为Calc的类,它从Form1开始,通过在构造函数中传递一个ICalculate对象和2个整数(a,b)。 此外,Calc类有一个方法(addition())用于使用ICalculate对象和在类的构造函数中实例化的两个整数来添加这两个整数,并在messagebox上显示结果

问题是编译器抛出一个错误,指出iCalCalculate对象尚未初始化(对象引用未设置为对象的实例)

代码如下:

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());
        }
    }
}
        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();
        }
    }
Form1代码如下所示:

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());
        }
    }
}
        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();
        }
    }

感谢您的帮助

问题出在
Calc
类的构造函数中。
具体而言,这一行:

var _nc = nc;
您应该删除
var

_nc = nc;
一旦有了
var
关键字,实际上就是在构造函数中创建一个名为
\u nc
的局部变量,并将
nc
的值赋给它,因此名为
\u nc
的类成员永远不会初始化

编译器(在VS 2013上测试)应为此发出警告:

字段'.Calc.\u nc'从未分配给,且其默认值始终为空


您是否将变量添加到“var\u nc=nc;”只是为了测试会发生什么?我会尝试不使用var,正如您已经声明的那样_nc…并使用调试器逐步完成代码“我正试图为我自己的兴趣构建一个虚拟练习”。不,我不认为您是。编译器可能会对此发出警告吗?应该有警告,只是测试它现在是什么。。。将很快编辑我的答案,只是好奇…NET经常警告同一函数中的多个声明…只是好奇VS 2013上测试的类构造函数和成员内部-警告不是关于隐藏类成员的局部变量,而是关于从未分配给的类成员。编辑我的答案以显示警告。嗯,我看到了警告,但我不明白,所以我想我以后再处理它…:)