ホームページ > バックエンド開発 > C++ > C# ではフィールドに参照を保持できないのはなぜですか? 代替手段は何ですか?

C# ではフィールドに参照を保持できないのはなぜですか? 代替手段は何ですか?

DDD
リリース: 2025-01-06 03:12:39
オリジナル
688 人が閲覧しました

Why Doesn't C# Allow Fields to Hold References, and What Are the Alternatives?

C# クラス フィールドの参照割り当て

C# で、クラス フィールドに「参照」によって代入しようとすると、予期しない動作が発生する可能性があります。次のコードを考えてみましょう。

public class X
{
    public X()
    {
        string example = "X";

        new Y(ref example);

        new Z(ref example);

        System.Diagnostics.Debug.WriteLine(example);
    }
}

public class Y
{
    public Y(ref string example)
    {
        example += " (Updated By Y)";
    }
}

public class Z
{
    private string _Example;

    public Z(ref string example)
    {
        this._Example = example;

        this._Example += " (Updated By Z)";
    }
}

var x = new X();
ログイン後にコピー

期待される出力は「X (Y によって更新) (Z によって更新)」ですが、代わりに「X (Y によって更新)」のみが出力されます。この現象は、「ref パラメータ」をフィールドに割り当てると参照が失われるために発生します。

なぜフィールドは参照を保持できないのですか?

次の場合、可能なオプションは 3 つだけです。 「ref type」のフィールドを考慮します:

  1. ref type のフィールドを許可しません:これは C# の現在の動作です。
  2. 参照タイプの安全でないフィールドを許可します: これにより、安全でないメモリにアクセスする可能性が許容され、予期しない動作が発生する可能性があります。
  3. スタックの外にローカル変数を保存します: これにより、ローカル変数を一時メモリ プールに保存する最適化が妨げられます。望ましくありません。

オプション 1 は、プログラムの安定性を確保し、コード内で時限爆弾が作成されるのを防ぐために選択されました。

参照のような動作を実現する方法

ref 型のフィールドを持つことはできませんが、参照のようなフィールドを実現する別の方法があります。動作:

  • 参照をカプセル化するクラスの作成: 参照される変数にアクセスして変更するためのゲッター メソッドとセッター メソッドを提供するクラスを作成できます。これは、別の変数を参照する間接的な方法です。
  • C# 7 機能の使用 (Ref Locals および Ref Returning Methods): C# はフィールドへの参照の格納をサポートしていませんが、ref locals はサポートしています。および ref を返すメソッド。これにより、参照によって渡され、複数のメソッドで変更できる ref 変数を作成できます。

以上がC# ではフィールドに参照を保持できないのはなぜですか? 代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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