C# 语法正确;无结果

C# 语法正确;无结果,c#,C#,我有一个奇怪的问题。我正在尝试编写一个函数,它查看一个文本框,如果它等于某个值,就会将字符串的值更改为其他值。 这是我的密码: 我在Main中定义字符串: string strDoorsOption1 = "test"; 该方法定义为: public void optionCheck(TextBox txt, string str) { if (txt.Text == "0") { str = "+++"; } else {

我有一个奇怪的问题。我正在尝试编写一个函数,它查看一个文本框,如果它等于某个值,就会将字符串的值更改为其他值。 这是我的密码:

我在Main中定义字符串:

string strDoorsOption1 = "test";
该方法定义为:

public void optionCheck(TextBox txt, string str)
{
    if (txt.Text == "0")
    {
        str = "+++";
    }
    else
    {
        str = "---";
    }
}
我这样调用该方法:

private void chkDoorsSafetyLaminated_CheckedChanged(object sender, EventArgs e)
{
    checkBoxClick3(chkDoorsSafetyLaminated, txtDoorsSafety1);
    optionCheck(txtDoorsSafety1, strDoorsOption1);
}
public string optionCheck(TextBox txt)
{
    if (txt.Text == "0")
    {
        return "+++";
    }
    else
    {
        return "---";
    }
}
checkBoxClick3是另一种用于更改文本框值的方法。 作为参考,其定义如下:

public void checkBoxClick3(CheckBox check, TextBox txt)
{
    /* Determine the CheckState of the Checkbox */
    if (check.CheckState == CheckState.Checked)
    {
        /* If the CheckState is Checked, then set the value to 1 */
        txt.Text = "1";
    }
    else
    {
        /* If the CheckState is Unchecked, then set the value to 0 */
        txt.Text = "0";
    }
}
这是有效的…:

if (txtDoorsSafety1.Text == "0")
{
    strDoorsOption1 = "+++";
}
else
{
    strDoorsOption1 = "---";
}
但是当我调用
optionCheck(txtDoorsSafety1,strdooroption1)时它的行为就像方法是空的一样。它完全编译,没有错误或警告,只是什么也不做


任何帮助都将不胜感激。

如果需要返回参数值,则需要使用引用参数。请尝试以下代码:

public void optionCheck(TextBox txt, ref string str)
{
    if (txt.Text == "0")
    {
        str = "+++";
    }
    else
    {
        str = "---";
    }
}

public void checkBoxClick3(CheckBox check, ref string txt)
{
    /* Determine the CheckState of the Checkbox */
    if (check.CheckState == CheckState.Checked)
    {
        /* If the CheckState is Checked, then set the value to 1 */
        txt = "1";
    }
    else
    {
        /* If the CheckState is Unchecked, then set the value to 0 */
        txt = "0";
    }
}
您可以使用ref或out,如果需要使用ref,请在使用之前声明参数

public void optionCheck(TextBox txt, string str)
按值传递字符串(就像所有引用一样),这意味着后面的赋值不会影响类级变量。您更改了本地副本,但没有使用它

相反,请按参考传递:

public void optionCheck(TextBox txt, ref string str)
称为:

optionCheck(txtDoorsSafety1, ref strDoorsOption1);
字符串
str
按值传递,而不是按其引用传递。这意味着在本例中,如果您更改它,它将不会更改字符串,而是创建一个新引用。此引用仅在此方法中可用

public void CheckBox click3(CheckBox check,TextBox txt)
起作用,因为
txt.Text
TextBox
对象内部的一个属性,即使在方法外部,它的引用也始终保持不变

您可以通过使用
ref
关键字来修复第一种方法,使其表现出您想要的样子(即实际通过引用传递)

在调用时,您还需要使用关键字:

optionCheck(txtDoorsSafety1, ref strDoorsOption1);
不过,更传统的方法是简单地让
optionCheck
方法实际返回字符串,而不是修改其输入:

public string optionCheck(TextBox txt, string str)
然后像这样打电话

strDoorsOption1 = optionCheck(txtDoorsSafety1, strDoorsOption1);

在调试器中单步执行代码并检查运行时值。当该方法在
str
上设置值时,
strdooroption1
是否也会得到更新?我的猜测是它没有,而且
字符串
是按值传递的(而
复选框
之类的东西是按引用传递的)

与其试图修改传递给方法的参数,不如让方法简单地返回一个值。然后,消费代码可以在需要的地方设置该值。大概是这样的:

private void chkDoorsSafetyLaminated_CheckedChanged(object sender, EventArgs e)
{
    checkBoxClick3(chkDoorsSafetyLaminated, txtDoorsSafety1);
    optionCheck(txtDoorsSafety1, strDoorsOption1);
}
public string optionCheck(TextBox txt)
{
    if (txt.Text == "0")
    {
        return "+++";
    }
    else
    {
        return "---";
    }
}
然后在代码中:

strDoorsOption1  = optionCheck(txtDoorsSafety1);
返回计算结果往往比修改方法的参数直观得多,这通常被视为调用方法的非直观或未经宣传的副作用。

它不起任何作用。对。 您正在使str引用成为一个新对象。要使其工作,您需要使用passbyreference

public void optionCheck(TextBox txt, ref string str)
{
    if (txt.Text == "0")
    {
        str = "+++";
    }
    else
    {
        str = "---";
   }
   //or:
   str = txt.Text == "0" ? "+++" : "---";
}
然后,使用以下命令调用它:
optionCheck(txtdoorsafety1,ref strdooroption1)

或者,您可以让该方法返回一个值:

public string optionCheck(TextBox txt, string str)
{
    return txt.Text == "0" ? "+++" : "---";
}
然后用以下命令调用它:
strdoorspoption1=optionCheck(txtdoorsafety1,strdoorspoption1)


阅读一些关于
ref
out
关键词的文档。什么都不做是什么意思?事实上,这种方法没有起到任何作用。CheckboxClick3可以正常工作,但我缺少的是
ref
,谢谢。这是有道理的,我知道
ref
存在,但我不知道如何使用它。我觉得奇怪的是,我在定义方法和调用方法时都必须使用它,这就是为什么它把我搞砸了。谢谢你。@zlysong我不确定,但我想这两个地方都需要它,所以你知道它(可能)会被修改。这样你就不会问“为什么我的变量在调用此函数后发生了变化?”这是必需的,但对我来说似乎是违反直觉的。我已经选择了一个可接受的答案,但你也是正确的,谢谢。这很有道理,谢谢,不幸的是,其他人已经获得了相同内容的公认答案。@zlysong这在stackoverflow上并不少见:)在您完成键入之前,会出现两个答案。这不是我想要做的,尽管我可以在这里看到模式。这个方法将被调用20多次,其他方法(使用
ref
)正是我想要的。