为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2019-10-12 10:02:24
我有一个存储库类和一个服务类,如下所示: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);    }}
查看完整描述

2 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

我个人只是在构造函数中初始化字段:


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-10-12
?
梦里花落0921

TA贡献1772条经验 获得超5个赞

即使可以保证初始化表达式按“文本顺序”执行,实例字段初始化程序也无法访问该this引用,并且您在其中隐式使用了该引用。


Dinner dinner = repo.GetDinner(5); 

相当于


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

恕我直言,最佳实践是将字段初始化保留为常量值或简单new语句。任何比该多的东西都应该交给构造函数。


查看完整回答
反对 回复 2019-10-12
  • 2 回答
  • 0 关注
  • 894 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信