2013-05-05 48 views
0

我有一个系统计时器每隔10秒触发一个事件。因此,每10秒我会从表单的主线程调用“Termocoppia”类,将“milliV”的值传递给它,并期望获取变量“tempEx”的值。类中变量的意外行为

public partial class Form1 : Form 
{ 

     public Form1() 
     { 
     InitializeComponent(); 
     System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
     timer.Tick += OnTimerTick; 
     timer.Interval = 10000; 
     timer.Start(); 
} 

double tempEx; 

//here a call the method "Calcola" in the class "Termocoppia" 
private void OnTimerTick(object sender, EventArgs e) 
{ 
     double milliV = Convert.ToDouble(textBox8.Text); //I have a value of 1.111 
     Termocoppia thm = new Termocoppia(); 
     thm.Calcola(milliV, tempEx); 
     textBox7.Text = tempEx.ToString(); 
} 

值milliV然后被转移到方法“Calcola”之类的“Termocoppia”内。我用一个断点调试它,并确认该值是在该类中接收的。

类“Termocoppia”是这样的:

public class Termocoppia 
{ 
    public double Calcola(double milliV, double tempEx)//here the value of milliV is still 1.111 
    { 
     tempEx= milliV;//here the value of tempEx is 0??? 
     return tempEx; 
    } 
} 

我希望收到回正好发送到大获好评类相同的价值,但我不断收到回0 如果我调试变量tempEx在行“tempEx = milliV”tempEx的值是0,我不明白为什么?我很确定我在这里犯了一个初学者的错误,但我不能正确解决这个问题。

+1

你刚刚调试到该行或在它上面? tempEx将为0,直到您在下一行 – Sayse 2013-05-05 09:50:18

+0

请记住,类型'double'的参数是按值传递的。 'tempEx = milliV;'不会改变你的'double tempEx;',因为它们是两个不同的对象。作为给参数赋值的非常简单的规则通常不是你想要的,除了'out'和'ref'参数外。 – Dirk 2013-05-05 09:54:09

+0

我刚刚检查过,在“return tempEx”这一行的值是正确的(1.111),但是如果我在主窗体中检查到私有无效OnTimerTick,它就是0.看起来我无法恢复它。 – FeliceM 2013-05-05 09:55:53

回答

2

您有两个名为'tempEx'的变量,一个字段和一个参数。您的Calcola函数会修改tempEx参数(不是字段)并返回相同的值。但是调用者没有对返回值做任何事情。我的建议是把两个这个值放到字段tempEx

修改您的线路:

thm.Calcola(milliV, tempEx); 

到:

tempEx = thm.Calcola(milliV, tempEx); 

一个建议:使用一个编码标准,以防止这种错误。对于使用camelCasing(so tempEx)的参数,字段使用下划线(_tempEx)。

+0

这完美的作品。非常感谢。我新来的是我犯了一个初学者的错误。 – FeliceM 2013-05-05 09:58:54

1

您没有使用Termocoppia.Calcola的返回值。

private void OnTimerTick(object sender, EventArgs e) 
{ 
    double milliV = Convert.ToDouble(textBox8.Text); //I have a value of 1.111 
    Termocoppia thm = new Termocoppia(); 
    // the return value from Cacola has to be assigned to tempEx 
    tempEx = thm.Calcola(milliV, tempEx); 
    textBox7.Text = tempEx.ToString(); 
} 

您不应该使用与tempEx相同的变量名作为成员变量和方法参数!

+0

谢谢,这与Martin已经给出的答案基本相同。 – FeliceM 2013-05-05 11:47:52