通过引用自动传递变量

时间:2013-05-20 22:26:06

标签: c#

我有这个代码示例。它通过引用传递变量,但它不应该(我不认为)。我认为通过引用传递变量是默认的。我不确定究竟要搜索什么来查找相关文档。

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

2 个答案:

答案 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方法中使用的任何方法都会影响引用的数据。

有道理。谢谢你们。

相关问题