我有这个代码示例。它通过引用传递变量,但它不应该(我不认为)。我认为通过引用传递变量是默认的。我不确定究竟要搜索什么来查找相关文档。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CS_example_2
{
class Program
{
static void Main(string[] args)
{
int result = setResult();
List<string> namesResult = new List<string>();
setResultAr(namesResult);
for (int i = 0; i < namesResult.Count; i += 1)
{
if (i == result)
{
System.Console.WriteLine("Result is " + namesResult[i]);
break;
}
}
System.Console.ReadKey();
}
static int setResult()
{
int result = 3;
return result;
}
static void setResultAr(List<string> namesResult)
{
List<string> res_array = new List<string>() { "item1", "item2", "item3, "item4", "item5" };
foreach (string s in res_array)
{
namesResult.Add(s);
}
}
}
}
答案 0 :(得分:6)
我认为通过引用传递变量是默认的。
不是。它通过值传递变量,它是对List<string>
的引用。由于List<string>
是引用类型,因此您可以在方法中修改它的内容。
如果您尝试重新分配变量本身,您可以看到变量(namesResult
)未通过引用传递,即:
static void SetList(List<string> namesResult)
{
List<string> res_array = new List<string>() { "item1", "item2", "item3, "item4", "item5" };
namesResult = res_array;
}
执行上述操作对原始变量没有影响,因为它是按值传递的。但是,如果您通过引用传递它(使用ref List<string>
),您会看到它可以重新分配变量本身。
关于这个主题的阅读材料,Jon Skeet写了一篇关于Parameter Passing in C#的精彩文章,详细讨论了这一点。
答案 1 :(得分:0)
在MSDN上找到答案:
引用类型的变量不直接包含其数据;它包含对其数据的引用。按值传递reference-type参数时,可以更改引用指向的数据,例如类成员的值。但是,您无法更改引用本身的值;也就是说,你不能使用相同的引用来为新类分配内存并让它在块外保持不变。
http://msdn.microsoft.com/en-us/library/s6938f28.aspx
由于namesResult值从未更改过,因此该变量仍引用与Main中定义的namesResult相同的数据。因此变量是两个独立的变量,但其中包含的值是对相同数据的引用。因此,setResultAr方法中使用的任何方法都会影响引用的数据。
有道理。谢谢你们。