ホームページ >バックエンド開発 >C++ >C# クラスのフィールドを参照によって割り当てることができない理由と、これを回避するにはどうすればよいですか?

C# クラスのフィールドを参照によって割り当てることができない理由と、これを回避するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-05 22:01:42399ブラウズ

Why Can't C# Class Fields Be Assigned by Reference, and How Can This Be Worked Around?

フィールドへの代入時に参照を保持する

C# では、クラス フィールドに「参照」によって代入することはできません。これは、フィールドを参照型にすることができないためです。これには主に 3 つの理由があります:

制限の理由:

  1. 安全でない参照フィールド: 参照フィールドを許可すると可能性が開かれます。コード内で「時限爆弾」を作成すること。メソッドの完了後に無効になり、潜在的なクラッシュにつながる可能性があるローカル変数に ref フィールドを割り当てるとします。
  2. 一時ストレージ プール: ローカル変数は通常、一時メモリ プールに格納されます。パフォーマンスを最適化します。 ref フィールドを許可すると、ガベージ コレクション ヒープを使用する必要があり、効率が低下します。

回避策:

制限にもかかわらず、シミュレートする回避策があります。参照のような動作:

デリゲートの使用とアクション:

必要な値のゲッターとセッターを含むデリゲートを作成します。このデリゲートを参照ではなくフィールドに保存します。例:

sealed class Ref<T>
{
    private readonly Func<T> getter;
    private readonly Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value { get { return getter(); } set { setter(value); } }
}

...
Ref<int> x;
void M()
{
    int y = 123;
    x = new Ref<int>(() => y, z => { y = z; });
    x.Value = 456;
    Console.WriteLine(y); // 456
}

この場合、x は y の値を取得および設定できるデリゲートを格納します。 x.Value を設定すると、y.

が変更されます。

以上がC# クラスのフィールドを参照によって割り当てることができない理由と、これを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。