亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

字段初始值設定項不能引用非靜態字段,方法或屬性嗎?

字段初始值設定項不能引用非靜態字段,方法或屬性嗎?

瀟瀟雨雨 2019-11-03 08:04:29
我有一個存儲庫類和一個服務類,如下所示:public class DinnerRepository{    DinnerDataContext db = new DinnerDataContext();    public Dinner GetDinner(int id)    {        return db.Dinners.SingleOrDefault(d => d.DinnerID == id);       }// Others Code        }public class Service{        DinnerRepository repo = new DinnerRepository();         Dinner dinner = repo.GetDinner(5);// Other Code}這引發錯誤:字段初始值設定項不能引用非靜態字段,方法或屬性。即使我對DinnerRepository類進行了詳細說明,也可以在Service Class中公開其方法GetDinner()??梢栽谙旅娴拇a中正常工作。是否有其他替代方法還是標準做法?我不能在這里使用靜態方法。public class Service{    public Service()    {        DinnerRepository repo = new DinnerRepository();         Dinner dinner = repo.GetDinner(5);    }}
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

我個人只是在構造函數中初始化字段:


public class Service

{

    private readonly DinnerRepository repo;

    private readonly Dinner dinner;


    public Service()

    {

        repo = new DinnerRepository();

        dinner = repo.GetDinner(5);

    }

}

請注意,這與您在問題底部顯示的代碼不同,因為這只是聲明局部變量。如果只需要局部變量,那很好-但是,如果需要實例變量,則使用上面的代碼。


基本上,字段初始值設定項的功能有限。根據C#4規范的10.5.5.2節:


實例字段的變量初始化器無法引用正在創建的實例。因此,this在變量初始值設定項中引用是編譯時錯誤,因為對于變量初始值設定項通過simple-name引用任何實例成員都是編譯時錯誤。


(“因此”和“因此”在我看來是錯誤的方式-通過簡單名稱引用成員是非法的,因為它引用this-我將對其進行ping Mads-但這基本上是相關的部分。)



查看完整回答
反對 回復 2019-11-04
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

即使可以保證初始化表達式按“文本順序”執行,實例字段初始化程序也無法訪問該this引用,并且您在其中隱式使用了該引用。


Dinner dinner = repo.GetDinner(5); 

相當于


Dinner dinner = this.repo.GetDinner(5);

恕我直言,最佳實踐是將字段初始化保留為常量值或簡單new語句。任何比該多的東西都應該交給構造函數。




查看完整回答
反對 回復 2019-11-04
  • 2 回答
  • 0 關注
  • 282 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號