0

我有一些静态的无效方法。

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

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

那么有人可以解释一下,当我发送参考时会发生什么StringBuilder,它只访问这个StringBuilder吗?(它没有正确复制它!)。

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

因此,在这种变量足够大且未被操纵的情况下,我是否应该始终发送它的引用,如果是,它是否会干扰某些事情?

4

4 回答 4

3

看看 Jon Skeet 的以下文章,他在其中彻底解释了按引用传递或按值传递之间的区别。

C#中的参数传递

或这篇博文说明了前一篇文章:

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

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

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

在此处输入图像描述

于 2011-09-13T07:37:51.393 回答
2

只要您正在处理引用类型(类,whichStringBuilderStringare),通过引用传递它们很少有任何意义,因为无论如何都不会复制。

于 2011-09-13T07:32:48.773 回答
0

非值类型总是通过引用传递。关键字的目的ref是让您更改对方法内部对象的引用

您误解了完全通过的论点。阅读这篇文章

于 2011-09-13T07:32:38.047 回答
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.
    }
}

为 pa 分配新值不会改变变量 x 的内容,因为 p 和 x 位于不同的内存位置。

按值传递引用元组参数会复制引用,但不会复制对象。字符串生成器的示例;这里 Foo 看到与StringBuildermain 实例化的对象相同的对象,但对它有一个独立的引用。所以 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 的值发生了变化。

希望这可以帮助。

于 2011-09-13T08:42:16.200 回答