我有一个奇怪的问题。我正在尝试编写一个查看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);
时,它就像方法是空的一样。它完全编译没有错误或警告,它什么都不做。
任何帮助都将不胜感激。
答案 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.Text
是TextBox
对象中的属性,其引用始终保持在方法之外。
您可以使用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);
答案 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);
返回计算结果往往比修改方法的参数更直观,这通常被视为调用方法的不直观或未公开的副作用。