ホームページ > バックエンド開発 > C++ > フィールド初期化子で非静的フィールドを初期化できないのはなぜですか?

フィールド初期化子で非静的フィールドを初期化できないのはなぜですか?

Linda Hamilton
リリース: 2025-01-03 13:16:41
オリジナル
930 人が閲覧しました

Why Can't I Initialize a Non-Static Field in a Field Initializer?

フィールド初期化の問題を理解する

コードには、Repository クラス (DinnerRepository) と、次を使用する Service クラス (Service) があります。データにアクセスするためのリポジトリ。ただし、「フィールド初期化子は、非静的フィールド、メソッド、またはプロパティを参照できません。」というエラーが発生します。

問題

このエラーは、フィールド初期化子が原因で発生します。 (クラス定義の直後のコード) は、同じクラスの非静的メンバー (つまり、インスタンス変数) を参照できません。この制限の理由は、フィールド初期化子が初期化しようとしているインスタンスに依存する循環参照を防ぐためです。

代替ソリューション

フィールド初期化子を使用するのではなく、推奨される解決策は 2 つあります:

1.コンストラクターの初期化:

Service クラスのコンストラクターでインスタンス変数を初期化します。

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

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

2.遅延初期化:

Lazy クラスを使用して、実際に必要になるまでインスタンス変数の初期化を延期します。

public class Service
{
    private readonly Lazy<DinnerRepository> repo = new Lazy(() => new DinnerRepository());
    private readonly Lazy<Dinner> dinner = new Lazy(() => repo.Value.GetDinner(5));

    public DinnerRepository Repo => repo.Value;
    public Dinner Dinner => dinner.Value;
}
ログイン後にコピー

インスタンス変数の重要性

ローカル変数は一時的な保存に役立ちますが、インスタンス変数はメンテナンスに重要ですオブジェクトの状態を管理し、複数のメソッド呼び出しにわたるデータへのアクセスを提供します。コンストラクターまたは遅延初期化を使用すると、インスタンス変数が適切に初期化され、クラス インスタンスの存続期間全体にわたって使用できることが保証されます。

結論

フィールド初期化子の参照機能には制限があります。非静的メンバー。コンストラクターや遅延初期化などの代替初期化メソッドを使用すると、このエラーを回避し、オブジェクトの状態を効果的に管理できます。

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

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