C#覆盖另一个函数中的字符串和字符串[]
本文关键字:字符串 覆盖 另一个 函数 | 更新日期: 2023-09-27 18:29:29
我覆盖setValues()函数中的变量"arr[1]"answers"test"。
arr[1]更改为"BBB"
但测试不会更改为"222"
输出:BBB111
但应该是BBB222
为什么字符串测试没有更新?
public class Program
{
static void Main(string[] args)
{
string[] arr = new string[10];
arr[1] = "AAA";
string test = "111";
setValues(arr, test);
int exit = -1;
while (exit < 0)
{
for (int i = 0; i < arr.Length; i++)
{
if (!String.IsNullOrEmpty(arr[i]))
{
Console.WriteLine(arr[i] + test);
}
}
}
}
private static void setValues(string[] arr, string test)
{
arr[1] = "BBB";
test = "222";
}
}
您需要通过引用传递该字符串才能在方法中修改它,您可以通过添加ref
关键字来实现这一点:
public class Program
{
static void Main(string[] args)
{
string[] arr = new string[10];
arr[1] = "AAA";
string test = "111";
setValues(arr, ref test);
int exit = -1;
while (exit < 0)
{
for (int i = 0; i < arr.Length; i++)
{
if (!String.IsNullOrEmpty(arr[i]))
{
Console.WriteLine(arr[i] + test);
}
}
}
}
private static void setValues(string[] arr, ref string test)
{
arr[1] = "BBB";
test = "222";
}
}
您只是在setValues
函数中更改对test
的本地引用。您需要通过引用(ref
)传递此变量
private static void setValues(string[] arr, ref string test)
{
arr[1] = "BBB";
test = "222";
}
然后这样称呼它:
setValues(arr, ref test);
这是因为setValues
方法中的test
prameter没有标记为ref
,所以它只在方法内部更改,而值不会在方法外部。
因为作为对象的数组是通过引用传递的,而字符串是通过值传递的。因此,函数setValues()更新测试的本地副本,调用方不可见,而更新字符串[]arr的ONLY实例,调用方可见而被调用方可见。
Paolo
原因是可变范围。SetValues()方法中引用的变量与Main中引用的不同。根据类的需要,有两种方法可以解决这个问题:
- 如其他答案中所述,在SetValues方法中通过引用传递值(这将保持代码的原样):
private static void setValues(string[] arr, ref string test) { arr[1] = "BBB"; test = "222"; }
- 将变量声明移到Main主体之外(这将变量的作用域更改为Class级别的变量,这将变量作用域扩展到整个类,并可能允许从其他类访问它们):
public class Program { static string[] arr = new string[10]; static string test = "111"; static void Main(string[] args) { arr[1] = "AAA";
然后也通过引用调用它:
SetValues(arr, ref test);