我有一些静态的void方法。
通过引用或值传递变量是否更好,因为我将大量文本传递给这些变量:
public static void renderText(ref StringBuilder build)
{
//Do your job.
}
有人可以解释一下,当我发送StringBuilder
的引用时会发生什么,它是否仅访问此StringBuilder
? (它没有正确复制!)。
以防万一我没有将输入参数的值或任何其他属性更改为方法。
所以,在这种情况下,变量足够大而且没有被操纵,我是否应该总是发送它的引用,如果是,它是否会干扰某些东西?
答案 0 :(得分:3)
请看Jon Skeet撰写的以下文章,其中他详细解释了通过引用或按值传递的区别。
或此博客文章说明了前一篇文章:
http://rapidapplicationdevelopment.blogspot.com/2007/01/parameter-passing-in-c.html
最后一篇文章实际上在其示例中使用了StringBuilder类型,因此您可以清楚地看到您的案例中发生了什么。如果你通过引用传递StringBuilder类型,你会得到这个:
通过引用传递的引用类型:
答案 1 :(得分:2)
只要您处理引用类型(类StringBuilder
和String
是),通过引用传递它们很少,因为无论如何都不会进行复制。
答案 2 :(得分:0)
非值类型始终通过引用传递。 ref
关键字的目的是让您将引用更改为方法内的对象。
你误解了完全传递的论点。阅读this article。
答案 3 :(得分:0)
按值传递参数
默认情况下,C#中的参数按值传递。这意味着在传递给方法时会创建值的副本:
class Test
{
static void Foo(int p)
{
p = p + 1; // Increment p by one.
Console.WriteLine(p); // Write p to screen.
}
static void Main()
{
int x = 8;
Foo(x); // Make a copy of x.
Console.WriteLine(x); // x will still be 8.
}
}
分配p新值不会更改变量x的内容,因为p和x位于不同的内存位置。
按值传递reference-tupe参数会复制引用,但不会复制对象。字符串构建器的示例;这里Foo看到了与主实例化相同的StringBuilder
对象,但它有一个独立的引用。所以StrBuild和fooStrBuild是引用相同StringBuilder
对象的单独变量:
class Test
{
static void Foo(StringBuilder fooStrBuild)
{
fooStrBuild.Append("testing");
fooStrBuild = null;
}
static void Main()
{
StringBuilder StrBuild = new StringBuilder();
Foo(strBuild);
Console.WriteLine(StrBuild.ToString()); // "testing"
}
}
因为fooStrBuild是引用的副本,更改其值不会更改StrBuild。
通过引用传递
在下文中,p和x指的是相同的存储位置:
class Test
{
static void Foo(ref int p)
{
p = p + 1; // Increment p by one.
Console.WriteLine(p); // Write p to screen.
}
static void Main()
{
int x = 8;
Foo(ref x); // Make a copy of x.
Console.WriteLine(x); // x is now 9.
}
}
因此p的值改变了。
希望这有帮助。