通过参考传递变量。或价值困境

时间:2011-09-13 07:27:43

标签: c# methods input-parameters

我有一些静态的void方法。

通过引用或值传递变量是否更好,因为我将大量文本传递给这些变量:

public static void renderText(ref StringBuilder build)
{
  //Do your job.
}

有人可以解释一下,当我发送StringBuilder的引用时会发生什么,它是否仅访问此StringBuilder? (它没有正确复制!)。

以防万一我没有将输入参数的值或任何其他属性更改为方法。

所以,在这种情况下,变量足够大而且没有被操纵,我是否应该总是发送它的引用,如果是,它是否会干扰某些东西?

4 个答案:

答案 0 :(得分:3)

请看Jon Skeet撰写的以下文章,其中他详细解释了通过引用或按值传递的区别。

Parameter passing in C#

或此博客文章说明了前一篇文章:

http://rapidapplicationdevelopment.blogspot.com/2007/01/parameter-passing-in-c.html

最后一篇文章实际上在其示例中使用了StringBuilder类型,因此您可以清楚地看到您的案例中发生了什么。如果你通过引用传递StringBuilder类型,你会得到这个:

通过引用传递的引用类型:

enter image description here

答案 1 :(得分:2)

只要您处理引用类型(类StringBuilderString是),通过引用传递它们很少,因为无论如何都不会进行复制。

答案 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的值改变了。

希望这有帮助。