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();
}
}
所以当我通过“酒店管理”输出应该是“酒店管理”, 但我得到了相同的输出,即“酒店管理”,而不是预期的输出“酒店管理”。
但是当我使用列表或其他参考类型对象时,我得到了预期的结果,即“酒店管理”
答案 0 :(得分:0)
答案 1 :(得分:0)
实际上,这与参数不可变无关,也不与参数作为引用类型有关。
您没有看到更改的原因是您为函数内的参数指定了新值。
没有ref
或out
关键字的参数始终按值传递。
我知道你现在抬起眉毛,但让我解释一下:
在没有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