为什么在函数调用中使用ref关键字来传递字符串参数

时间:2015-05-21 07:21:35

标签: c#

String是一个引用类型,所以当我们传入函数调用以获取主函数中的更改时,为什么我们必须在字符串变量之前附加ref关键字 例如:

 using System;    
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

 namespace ConsoleApplication1
 {
    class Program
    {
       static void Main(string[] args)
       {
          string keyword= string.Empty;
          removeWhiteSpacetest(keyword);
          Console.WriteLine("Printing In Main");
          Console.ReadLine();
       }
    }

    private void removeWhiteSpacetest( string keyword)
    {
       string pattern = "\\s+";
       string replacement = " ";
       Regex rgx = new Regex(pattern);

       //white space removal
       keyword = rgx.Replace(keyword, replacement).Trim();
    }
 }

所以当我通过“酒店管理”输出应该是“酒店管理”, 但我得到了相同的输出,即“酒店管理”,而不是预期的输出“酒店管理”。

但是当我使用列表或其他参考类型对象时,我得到了预期的结果,即“酒店管理”

2 个答案:

答案 0 :(得分:0)

根据以下评论更新参考文献。

当您添加ref关键字时,您将传递值传递对基础值的引用,因此可以更改数据的值。 引用变量就像一个指针,而不是值本身

阅读MSDN文章。

答案 1 :(得分:0)

实际上,这与参数不可变无关,也不与参数作为引用类型有关。

您没有看到更改的原因是您为函数内的参数指定了新值。

没有refout关键字的参数始终按值传递。
我知道你现在抬起眉毛,但让我解释一下:
在没有ref关键字的情况下传递的引用类型参数实际上是通过值传递它的引用
有关详细信息,请this article阅读Jon Skeet

为了证明我的说法,我创建了一个小程序,您可以复制并粘贴以查找自己,或只是check this fiddle

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        String StringInput = "Input";

        List<int> ListInput = new List<int>();

        ListInput.Add(1);
        ListInput.Add(2);
        ListInput.Add(3);

        Console.WriteLine(StringInput);

        ChangeMyObject(StringInput);

        Console.WriteLine(StringInput);


        Console.WriteLine(ListInput.Count.ToString());

        ChangeMyObject(ListInput);

        Console.WriteLine(ListInput.Count.ToString());



        ChangeMyObject(ref StringInput);

        Console.WriteLine(StringInput);

        ChangeMyObject(ref ListInput);

        Console.WriteLine(ListInput.Count.ToString());



    }

    static void ChangeMyObject(String input)
    {

        input = "Output";
    }

    static void ChangeMyObject(ref String input)
    {

        input = "Output";
    }


    static void ChangeMyObject(List<int> input)
    {

        input = new List<int>();
    }

    static void ChangeMyObject(ref List<int> input)
    {

        input = new List<int>();
    }


}

这个程序的输出是:

Input
Input
3
3
Output
0