C# C语言中的函数有问题吗#

C# C语言中的函数有问题吗#,c#,function,C#,Function,我正在编写一个程序,试图计算给定数字的绝对值。我的代码有几个部分。第一部分通过监视一个数字上下框来检查方程是一项还是两项。如果是一个术语,则只会显示一个输入框,名为p.choice的公共变量设置为1。但是,如果是两个术语,将出现两个输入框,p.choice设置为2。当用户单击go按钮时,程序将检查p.choice是否等于1或2(稍后我将为0添加一个例外)。我还没有2的函数。但如果p.choice等于1,它将运行一个名为calculate1()的函数。此函数根据从第一个文本框中拾取的公共变量检查该

我正在编写一个程序,试图计算给定数字的绝对值。我的代码有几个部分。第一部分通过监视一个数字上下框来检查方程是一项还是两项。如果是一个术语,则只会显示一个输入框,名为p.choice的公共变量设置为1。但是,如果是两个术语,将出现两个输入框,p.choice设置为2。当用户单击go按钮时,程序将检查p.choice是否等于1或2(稍后我将为0添加一个例外)。我还没有2的函数。但如果p.choice等于1,它将运行一个名为calculate1()的函数。此函数根据从第一个文本框中拾取的公共变量检查该变量是否为正或负。如果它是负的,那么它就是正的。然后返回该变量。这是我整个类的代码(没有从另一个类调用任何东西)

公共部分类表单1:表单
{
私有整数计算1()
{
Form1 p=新的Form1();
如果(p.box1<0)
{
p、 box1=p.box1*-1;
}
返回p.box1;
}
公共选择;
公共信息框1;
公共信息框2;
公共表格1()
{
初始化组件();
}
私有void numericUpDown1_值已更改(对象发送方,事件参数e)
{
Form1 p=新的Form1();
decimal changeValue=numericUpDown1.值;
changeValue=转换为32(changeValue);
如果(changeValue==1)
{
textBox1.Visible=true;
textBox2.Visible=false;
p、 选择=1;
}
else if(changeValue==2)
{
textBox1.Visible=true;
textBox2.Visible=true;
p、 选择=2;
}
其他的
{
textBox1.Visible=false;
textBox2.Visible=false;
p、 选择=0;
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Form1 p=新的Form1();
如果(p.choice==1)
{
//p、 box1=转换为32(textBox1.Text);
//p、 box1=计算1();
//string result=“答案是”+p.box1;
//标签2.Text=“5”;
//显示(“回答!”,结果,MessageBox按钮。确定);
label2.Text=“你好,世界”;
}
else if(p.choice==2)
{
p、 box1=转换为32(textBox1.Text);
p、 box2=转换为32(textBox2.Text);
}
}
}

我的问题来自于点击按钮。什么都没有发生,我知道这意味着p.choice没有被设置为等于任何东西,因为我还没有一个else子句。然而,当我在数字框中选择1并输入一个值时,我似乎无法理解为什么p.choice没有设置为1。在前面的编辑中,我尝试将label2.text=设置为将p.choice转换为int32。当我改变箱号时,标签正确地改变了箱号。所以我知道这个号码是在这段代码中注册的。我只是不明白为什么它在下一部分不起作用。如果有人能帮我,我将非常感激。

p.choice
始终为零,因为您在每个函数中不断实例化一个新的
Form1
对象

这一行:

Form1 p = new Form1();
调用
Form1
类的构造函数,该类将字段
choice
(一个
int
)设置为其默认值零

因此,当您在条件逻辑中检查
p.choice
的值时,
if
else if
都不是真的:

// This is false, because p.choice is zero
if (p.choice == 1)

// This is false, because p.choice is zero
else if (p.choice == 2)
您不需要创建该类的新实例,因为您已经在该类中

删除此行:

Form1 p = new Form1();
而是使用
this
,它是对类实例的引用,如下所示:

private void button1_Click(object sender, EventArgs e)
{
    if (this.choice == 1)
    {
        //this.box1 = Convert.ToInt32(textBox1.Text);
        //this.box1 = calculate1();
        //string result = "The Answer Is " + this.box1;
        //label2.Text = "5";
        //MessageBox.Show("Answer!", result, MessageBoxButtons.OK);
        label2.Text = "Hello World";

    }
    else if (this.choice == 2)
    {
        this.box1 = Convert.ToInt32(textBox1.Text);
        this.box2 = Convert.ToInt32(textBox2.Text);
    }
}

Math.Abs
有问题吗?在您引用的每个方法
p.choice
中,您可以简单地引用
choice
,它是表单的一个属性,因此在方法的范围内。
private void button1_Click(object sender, EventArgs e)
{
    if (this.choice == 1)
    {
        //this.box1 = Convert.ToInt32(textBox1.Text);
        //this.box1 = calculate1();
        //string result = "The Answer Is " + this.box1;
        //label2.Text = "5";
        //MessageBox.Show("Answer!", result, MessageBoxButtons.OK);
        label2.Text = "Hello World";

    }
    else if (this.choice == 2)
    {
        this.box1 = Convert.ToInt32(textBox1.Text);
        this.box2 = Convert.ToInt32(textBox2.Text);
    }
}