-1

我有这个代码示例。它通过引用传递变量,但它不应该(我不认为)。我认为它默认通过引用传递变量。我不确定要搜索什么才能找到关于此的文档。

    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);
                }
            }
        }
    }
4

2 回答 2

6

我认为它默认通过引用传递变量。

它不是。它通过值传递变量,这是对 a 的引用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 写了一篇关于C# 中的参数传递的精彩文章,其中详细讨论了这一点。

于 2013-05-20T22:28:07.430 回答
0

在 MSDN 上找到了答案:

引用类型的变量不直接包含其数据;它包含对其数据的引用。当您通过值传递引用类型参数时,可以更改引用指向的数据,例如类成员的值。但是,您不能更改引用本身的值;也就是说,您不能使用相同的引用来为新类分配内存并让它在块之外持续存在。

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

因为 namesResult 的值从未改变,所以这个变量仍然引用与 Main 中定义的 namesResult 相同的数据。所以变量是两个独立的变量,但其中包含的值是对相同数据的引用。因此,在 setResultAr 方法中使用的任何方法都会影响引用的数据。

说得通。谢谢你们。

于 2013-05-20T22:41:48.390 回答