Передача переменной по Ref. или дилемма стоимости - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть несколько статических методов void.

Лучше ли передавать переменные по ссылке или по значению, потому что я передаю большое количество текста в эти переменные:

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

Так может ли кто-нибудь объяснить мне, что происходит, когда я отправляю ссылку на StringBuilder, это только доступ к этому StringBuilder? (Это не копирует это правильно!).

И на всякий случай я не изменяю значение или любое другое свойство входных аргументов в методы.

Итак, в тех случаях, когда переменные достаточно велики и ими не манипулируют, я должен всегда отправлять ссылку на них, и если да, это мешает чему-либо?

Ответы [ 4 ]

3 голосов
/ 13 сентября 2011

Взгляните на следующую статью Джона Скита, в которой он подробно объясняет разницу между передачей по ссылке или по значению.

Передача параметра в C #

или это сообщение в блоге, которое иллюстрирует предыдущую статью:

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

В последней статье фактически используется тип StringBuilder в своих примерах, чтобы вы могли четко видеть, что происходит в вашем случае.Если вы передадите тип StringBuilder по ссылке, вы получите следующее:

Тип ссылки, переданный по ссылке:

enter image description here

2 голосов
/ 13 сентября 2011

Пока вы имеете дело со ссылочными типами (классами, которые StringBuilder и String), редко есть смысл передавать их по ссылке, так как в любом случае копия не будет сделана.

0 голосов
/ 13 сентября 2011

Передача аргументов по значению

По умолчанию аргументы в 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 видит тот же StringBuilder объект, который был создан в main, но имеет независимую ссылку на него.Таким образом, 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 изменяется.

Надеюсьэто помогает.

0 голосов
/ 13 сентября 2011

Типы без значений всегда передаются по ссылке.Цель ключевого слова ref - дать вам возможность изменить ссылку на объект внутри метода.

Вы неправильно поняли аргументы, передаваемые полностью.Прочитайте эту статью .

...