C# 对象传递给在C中不维护引用的方法#
为了我自己的兴趣,我正试图做一个模拟练习。 我有一个表单(form1),有两个文本框(textBox1,textBox2)和一个按钮 当我单击按钮时,我想添加传递到文本框的数字。 现在,我试图通过引入一个接口和一个实现该接口的类(计算),该接口带有执行加法(ICalculate)的适当方法的签名,从而使事情复杂化 然后,我有另一个名为Calc的类,它从Form1开始,通过在构造函数中传递一个ICalculate对象和2个整数(a,b)。 此外,Calc类有一个方法(addition())用于使用ICalculate对象和在类的构造函数中实例化的两个整数来添加这两个整数,并在messagebox上显示结果 问题是编译器抛出一个错误,指出iCalCalculate对象尚未初始化(对象引用未设置为对象的实例) 代码如下:C# 对象传递给在C中不维护引用的方法#,c#,C#,为了我自己的兴趣,我正试图做一个模拟练习。 我有一个表单(form1),有两个文本框(textBox1,textBox2)和一个按钮 当我单击按钮时,我想添加传递到文本框的数字。 现在,我试图通过引入一个接口和一个实现该接口的类(计算),该接口带有执行加法(ICalculate)的适当方法的签名,从而使事情复杂化 然后,我有另一个名为Calc的类,它从Form1开始,通过在构造函数中传递一个ICalculate对象和2个整数(a,b)。 此外,Calc类有一个方法(addition())用于使用
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上测试的类构造函数和成员内部-警告不是关于隐藏类成员的局部变量,而是关于从未分配给的类成员。编辑我的答案以显示警告。嗯,我看到了警告,但我不明白,所以我想我以后再处理它…:)