ホームページ > バックエンド開発 > C++ > C# では参照によるクラス フィールドへの値の受け渡しが機能しないのはなぜですか?また、同様の動作を実現するにはどうすればよいですか?

C# では参照によるクラス フィールドへの値の受け渡しが機能しないのはなぜですか?また、同様の動作を実現するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-05 22:38:40
オリジナル
665 人が閲覧しました

Why Doesn't Passing Values to Class Fields by Reference Work in C# and How Can I Achieve Similar Behavior?

C での参照によるクラス フィールドへの値の受け渡し

C# では、ref を使用して参照によるクラス フィールドへの値の割り当てを実現できるように見えるかもしれません。 パラメータ修飾子。ただし、この手法では、フィールドに割り当てるときに参照を保持できません。

問題

次のコード スニペットを考えてみましょう。

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 によって更新)」のみです。このため、フィールドに代入するときに参照をどのように維持するかという問題が生じます。

答え

この制限は、C# が ref 型のフィールドを許可しないという事実に起因しています。この制約により、ref フィールドを完全に禁止するか、クラッシュにつながる可能性がある安全でないフィールドを許可するかの選択が迫られます。さらに、ローカル変数 (スタック) に一時記憶域プールを使用すると、メソッドの完了後に存在しない可能性がある値へのアクセスと競合します。

これらの問題を回避するために、C# では ref フィールドを禁止し、 の使用を推奨します。 getter メソッドと setter メソッド の代わりに:

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 -- setting x.Value changes y.
}
ログイン後にコピー

このアプローチを使用すると、x y がガベージ コレクション ヒープに格納されている場合でも、y の値を取得および設定できるオブジェクトになります。

一方、C# はそうではありません。 ref を返すメソッドと ref パラメーターを直接サポートしており、この機能は C# 7 で実装されました。ただし、ref 型をフィールドとして使用できないという制限は残ります。

以上がC# では参照によるクラス フィールドへの値の受け渡しが機能しないのはなぜですか?また、同様の動作を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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