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