【发布时间】:2020-04-15 04:25:49
【问题描述】:
我一直在阅读有关值和引用类型以及 ref 关键字的内容,特别注意这篇文章:C# string reference type?。 Jon Skeet 的回答“对字符串的引用是按值传递的。按值传递引用和按引用传递对象之间存在很大差异。不幸的是,在这两种情况下都使用了“引用”这个词。即使在他的例子之后也让我感到困惑。
考虑一下:
string x = "foo";
void Bar(string s)
{
Console.Write(s);
}
Bar(x);
我的问题:当将x 传递给Bar 时,s 是表示内存中x 的完整副本还是s 是指向x 的指针?如果x 真的很大,这将变得相关。当我想要做的只是将s 转换成不同的东西(不改变s 本身?)时,通过ref 传递x 是否会带来性能优势?)
【问题讨论】:
-
传递的是
x的引用副本。顺便说一句,转换strings 总是会产生新的strings。 -
您编写的代码在任何时候都不会创建字符串的多个副本。你不需要通过
ref传递它。 -
s也不是指向x的指针。x是对“foo”的引用。s是该引用的副本,指向同一个“foo”。 -
发送反馈。那么它是否类似于 C 中的**指针?
-
我会说它类似于*指针。
string的唯一特别之处在于它是“不可变的”(该类只是不公开任何突变 API)。传递string就像传递任何其他class对象一样。如果您将Dictionary传递给函数,则不会期望复制。你基本上是在传递一个指针的副本。
标签: c#