0

静的な void メソッドがいくつかあります。

これらの変数に大量のテキストを渡しているため、変数を参照または値で渡す方が良いですか?

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

の参照を送信するとどうなるか、誰かが説明してくれませんStringBuilderStringBuilder? (それは正しくコピーされません!)。

そして、入力引数の値やその他のプロパティをメソッドに変更しない場合に備えて。

したがって、変数が十分に大きく、操作されていないこの場合、常にその参照を送信する必要がありますか? はいの場合、何かに干渉しますか?

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

StringBuilder参照型 (クラス、whoおよびare)を扱っている限り、いずれにStringしてもコピーが作成されないため、それらを参照渡しする意味はほとんどありません。

于 2011-09-13T07:32:48.773 に答える
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は異なるメモリ位置にあるため、pa new valueを割り当てても、変数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の値が変更されます。

お役に立てれば。

于 2011-09-13T08:42:16.200 に答える
0

非値型は常に参照によって渡されます。キーワードの目的は、メソッド内のオブジェクトへの参照refを変更できるようにすることです。

引数の受け渡しを完全に誤解しています。この記事を読んでください。

于 2011-09-13T07:32:38.047 に答える