字段初始值设定项不能引用非静态字段,方法或属性?
我有一个Repository类和一个Services Class,如下所示:
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); } }
就个人而言,我只是在构造函数中初始化字段:
public class Service { private readonly DinnerRepository repo; private readonly Dinner dinner; public Service() { repo = new DinnerRepository(); dinner = repo.GetDinner(5); } }
请注意,这与您在问题底部显示的代码不同,因为它只声明局部变量。 如果你只想要局部变量,那很好 – 但如果你需要实例变量,那么使用上面的代码。
基本上,现场初始化器的function有限。 从C#4规范的10.5.5.2节:
实例字段的变量初始值设定项无法引用正在创建的实例。 因此,在变量初始化程序中引用它是一个编译时错误,因为变量初始化程序通过简单名称引用任何实例成员是编译时错误。
(“因此”和“因此”对我来说是错误的方式 – 通过一个简单的名称引用一个成员是非法的, 因为它引用了this
– 我会ping Mads关于它 – 但这基本上是相关部分。)
即使初始化表达式保证是“文本顺序” ,实例字段初始化程序访问this
引用也是非法的,并且您隐式在
Dinner dinner = repo.GetDinner(5);
这相当于
Dinner dinner = this.repo.GetDinner(5);
IMHO的最佳实践是将字段初始化保留为常量值或简单的new
语句。 任何比这更毛茸茸的东西应该去构造函数。
上述就是C#学习教程:字段初始值设定项不能引用非静态字段,方法或属性?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/998690.html