字段初始值设定项不能引用非静态字段,方法或属性吗?

我有一个存储库类和一个服务类,如下所示:


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()。可以在下面的代码中正常工作。是否有其他替代方法还是标准做法?我不能在这里使用静态方法。


public class Service

{


    public Service()

    {

        DinnerRepository repo = new DinnerRepository(); 

        Dinner dinner = repo.GetDinner(5);

    }


}


潇潇雨雨
浏览 246回答 2
2回答

慕婉清6462132

我个人只是在构造函数中初始化字段: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-但这基本上是相关的部分。)

慕娘9325324

即使可以保证初始化表达式按“文本顺序”执行,实例字段初始化程序也无法访问该this引用,并且您在其中隐式使用了该引用。Dinner dinner = repo.GetDinner(5); 相当于Dinner dinner = this.repo.GetDinner(5);恕我直言,最佳实践是将字段初始化保留为常量值或简单new语句。任何比该多的东西都应该交给构造函数。
打开App,查看更多内容
随时随地看视频慕课网APP