タイトル: string 型が参照型であることを示すサンプルコード

以下のコードは、C# の string 型が参照型であることを説明するためのサンプルです。また、new 演算子を使用して明示的に string オブジェクトを生成し、その参照の挙動を観察します。

using System;

class Program
{
    static void Main()
    {
        // new演算子を使ってstringオブジェクトを生成
        string str1 = new string(new char[] { 'H', 'e', 'l', 'l', 'o' });
        string str2 = str1; // str1の参照をstr2に代入

        Console.WriteLine($"str1: {str1}");
        Console.WriteLine($"str2: {str2}");

        // str2を変更する
        str2 = "World";

        // 参照型であってもstringはイミュータブルなため、str1には影響しない
        Console.WriteLine("\n変更後:");
        Console.WriteLine($"str1: {str1}");
        Console.WriteLine($"str2: {str2}");

        // メモリアドレスの確認(参考: Object.ReferenceEquals を使用)
        Console.WriteLine("\nメモリアドレス比較:");
        Console.WriteLine($"str1とstr2は同じ参照を持っている: {Object.ReferenceEquals(str1, str2)}");

        // newで生成した場合のアドレス確認(参照型特性の確認)
        string str3 = new string(new char[] { 'H', 'e', 'l', 'l', 'o' });
        Console.WriteLine($"str1とstr3は同じ参照を持っている: {Object.ReferenceEquals(str1, str3)}");
    }
}

コードのポイント

  1. new string(char[]) を使用して string オブジェクトを明示的に生成。
  2. str1 を別の変数 str2 に代入し、str2 を変更。
    • 変更後も string のイミュータブル特性により、str1 の値は影響を受けません。
  3. Object.ReferenceEquals を使い、異なるインスタンスが生成されていることを確認。

実行結果の例

str1: Hello
str2: Hello

変更後:
str1: Hello
str2: World

メモリアドレス比較:
str1とstr2は同じ参照を持っている: False
str1とstr3は同じ参照を持っている: False

解説

  • 参照型としての特性:
    • string 型は参照型であり、new を使うとメモリ上に新しいオブジェクトが生成されます。
  • イミュータブル性:
    • string オブジェクトは一度生成されるとその内容を変更できません。そのため、str2 を変更しても str1 に影響を与えません。

このサンプルコードは、string の参照型としての特性とイミュータブル性の両方を示すのに役立ちます。

C#,参照型

Posted by hidepon