正确的句法;没有结果

时间:2014-06-17 17:54:54

标签: c#

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

我在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);
}

checkBoxClick3 是另一种可以更改TextBox值的方法。 供参考,定义如下:

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, strDoorsOption1);时,它就像方法是空的一样。它完全编译没有错误或警告,它什么都不做。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:4)

public void optionCheck(TextBox txt, string str)

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

相反,通过ref:

public void optionCheck(TextBox txt, ref string str)

被称为:

optionCheck(txtDoorsSafety1, ref strDoorsOption1);

答案 1 :(得分:2)

public void optionCheck(TextBox txt, string str)

字符串str按值传递,而不是通过其引用传递。这意味着在这种情况下,如果您更改它,它将不会更改字符串,而是创建一个新的引用。此参考仅适用于此方法。

public void checkBoxClick3(CheckBox check, TextBox txt)有效,因为txt.TextTextBox对象中的属性,其引用始终保持在方法之外。

您可以使用ref关键字修复第一种方法,使其按您的方式行事(即实际通过引用传递)

public void optionCheck(TextBox txt, ref string str)

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

optionCheck(txtDoorsSafety1, ref strDoorsOption1);

虽然,更常规的方法是简单地让optionCheck方法实际返回字符串而不是修改其输入:

public string optionCheck(TextBox txt, string str)

然后像

一样打电话
strDoorsOption1 = optionCheck(txtDoorsSafety1, strDoorsOption1);

答案 2 :(得分:2)

它什么都不做。真正。 你正在str引用一个新对象。要使其工作,您需要使用传递引用。

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

然后,您可以使用:optionCheck(txtDoorsSafety1, ref strDoorsOption1);

来调用它

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

public string optionCheck(TextBox txt, string str)
{
    return txt.Text == "0" ? "+++" : "---";
}

然后使用:strDoorsOption1 = optionCheck(txtDoorsSafety1, strDoorsOption1);

调用它

http://msdn.microsoft.com/en-us/library/0f66670z.aspx

答案 3 :(得分:1)

如果需要返回参数值,则需要使用references参数试试此代码:

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则需要在使用之前声明参数

答案 4 :(得分:0)

逐步调试调试器中的代码并检查运行时值。当方法在str上设置值时,strDoorsOption1是否也会更新?我的猜测是它没有,并且string正在按值传递(而CheckBox之类的东西是通过引用传递的。)

不要试图修改传递给方法的参数,而是让方法只返回一个值。然后,消费代码可以将该值设置为需要的值。像这样:

public string optionCheck(TextBox txt)
{
    if (txt.Text == "0")
    {
        return "+++";
    }
    else
    {
        return "---";
    }
}

然后消耗代码:

strDoorsOption1  = optionCheck(txtDoorsSafety1);

返回计算结果往往比修改方法的参数更直观,这通常被视为调用方法的不直观或未公开的副作用。