考虑到:
void Update(){
Method("String");
}
我想确认这是每轮创建一个新字符串,然后该字符串由放置在堆栈上的新变量引用。
那就更好了:
string param = "String";
void Update(){
Method(param);
}
我认为这可以避免每一轮创建新字符串,并且它总是与堆栈变量引用的相同。另外,请记住只读取字符串而不进行修改。
答案 0 :(得分:2)
void Update(){
Method("String");
}
在这个例子中" String"将被封锁一次,内存中只有一个对象。
答案 1 :(得分:1)
字符串文字由c#编译器存储在内部池中,每个程序集一个,并根据需要重用。有关文档,请参阅String.Intern Method
公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串实例仅在系统中存在一次。
例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量。
更多here。您可以说服自己,您的字符串内部存储了String.IsInterned。
答案 2 :(得分:1)
亲自尝试:
string oldS;
int count;
void Method(string s)
{
if (ReferenceEquals(oldS, s)) // compare by reference
{
count++;
}
oldS = s;
}
public void Test()
{
for (var i = 0; i < 100; i++)
{
Method("string");
}
Console.WriteLine(count);
}
运行上面的代码,您可以看到输出为99
(第一次不计算)。也许这会让你觉得更安全;)
答案 3 :(得分:0)
void Update(){
Method("String");
}
内存中肯定会有一个对象,
如果你选择了这个,那么你需要知道三件事情来预测会发生什么,
string param = "String";
void Update(){
Method(param);
}
1.Strings是C#中的引用类型。但这只是图片的一部分。
2.他们也是不可改变的,所以每当你做一些看起来像你正在改变字符串的事情时,你就不是。 创建一个全新的字符串,引用指向它,旧的字符串被抛弃。
3.即使字符串是引用类型,strMain也不会通过引用传递。它是一个引用类型,但引用是按值传递的。