ホームページ > バックエンド開発 > C++ > C# で別の非静的フィールドへの参照を使用して非静的フィールドを初期化できないのはなぜですか?

C# で別の非静的フィールドへの参照を使用して非静的フィールドを初期化できないのはなぜですか?

Susan Sarandon
リリース: 2024-12-31 13:08:10
オリジナル
341 人が閲覧しました

Why Can't I Initialize a Non-Static Field with a Reference to Another Non-Static Field in C#?

フィールド初期化子の曖昧さ: サービス クラスの非静的フィールド参照

ソフトウェア開発では、クラス内のインスタンス フィールドを初期化する必要があることがよくあります。それらの機能を活用します。ただし、別のクラスの非静的フィールド、メソッド、またはプロパティへの参照を使用してインスタンス フィールドを初期化しようとすると、「フィールド初期化子は非静的フィールド、メソッド、またはプロパティを参照できません。」というエラーが発生します。

DinnerRepository クラスと Service クラスがある次の例を考えてみましょう。

public class DinnerRepository
{
    DinnerDataContext db = new DinnerDataContext();
    public Dinner GetDinner(int id) {...}
}

public class Service
{
    DinnerRepository repo = new DinnerRepository(); 
    Dinner dinner = repo.GetDinner(5);
}
ログイン後にコピー

このコードをコンパイルしようとすると、前述のエラーがスローされます。これは、Service クラスのディナーのフィールド初期化子が非静的であるリポジトリ インスタンスを参照するためです。フィールド初期化子はスコープが制限されており、インスタンス固有のメンバーにアクセスできません。

この問題を解決する一般的な解決策の 1 つは、コンストラクターが実行されるまで初期化を延期することです。ただし、このアプローチでは、インスタンス変数ではなくローカル変数が作成されます。

推奨される解決策は、コンストラクターでフィールドを初期化し、このインスタンスを暗黙的に参照できるようにすることです。このアプローチにより、目的の動作を持つインスタンス変数が作成されます。

public class Service
{
    private DinnerRepository repo;
    private Dinner dinner;

    public Service()
    {
        repo = new DinnerRepository();
        dinner = repo.GetDinner(5);
    }
}
ログイン後にコピー

フィールド初期化子の制限を理解することで、開発者はこの一般的なエラーを回避し、コード内のインスタンス変数を効果的に管理できます。

以上がC# で別の非静的フィールドへの参照を使用して非静的フィールドを初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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