ホームページ > バックエンド開発 > C++ > なぜC#文字列の動作は、その参照タイプの性質と矛盾しているように見えるのですか?

なぜC#文字列の動作は、その参照タイプの性質と矛盾しているように見えるのですか?

Linda Hamilton
リリース: 2025-01-24 06:56:10
オリジナル
659 人が閲覧しました

Why Does C# String Behavior Seem to Contradict Its Reference Type Nature?

C# の文字列が場合によっては参照型のように機能しないのはなぜですか?

文字列は C# では参照型として定義されていますが、特定のコード シナリオでは動作が異なります。次のコードを考えてみましょう:

<code class="language-csharp">class Test
{
    public static void Main()
    {
        string test = "传递前";
        Console.WriteLine(test);
        TestI(test);
        Console.WriteLine(test);
    }

    public static void TestI(string test)
    {
        test = "传递后";
    }
}</code>
ログイン後にコピー

このコードの期待される出力は、文字列の参照の性質を反映して、「通過前」と「通過後」です。ただし、実際の出力は両方の行が「前に渡される」というもので、参照ではなく値によって渡されることを示しています。

この違いの理由は、C# での参照の処理方法にあります。文字列型は確かに参照型ですが、参照がパラメータとしてメソッドに渡される場合、値によって渡されます。これは、元の値への参照ではなく、参照のコピーが作成されることを意味します。

文字列を参照によって渡したい場合は、「ref」キーワードを使用する必要があります:

<code class="language-csharp">public static void TestI(ref string test)</code>
ログイン後にコピー

これにより、メソッドが元の文字列への参照を確実に受け取り、メソッド内で行われた変更を呼び出し元のコードに反映できるようになります。

参照オブジェクトの値の変更と参照自体の変更を区別することが重要です。文字列は不変で変更できませんが、参照を別の文字列に再割り当てすることはできます。

より明確に示すために、可変型 StringBuilder を含む別の例を使用してみましょう。

<code class="language-csharp">using System.Text;

class Test
{
    public static void Main()
    {
        StringBuilder test = new StringBuilder();
        Console.WriteLine(test);
        TestI(test);
        Console.WriteLine(test);
    }

    public static void TestI(StringBuilder test)
    {
        test.Append("修改");
    }
}</code>
ログイン後にコピー

この場合、出力は「」と「modified」になります。これは、メソッドで行われた変更が呼び出し元のコードに反映されていることを示します。これは、StringBuilder が変更可能な参照型であるためです。

以上がなぜC#文字列の動作は、その参照タイプの性質と矛盾しているように見えるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート