我有一个Repository Class和一个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);
}
}
答案 0 :(得分:18)
我个人只是在构造函数中初始化字段:
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
是编译时错误,因为变量初始化程序通过简单名称引用任何实例成员是编译时错误。
(“因此”和“因此”对我来说是错误的方式 - 通过简单名称引用成员是非法的,因为它引用this
- 我会ping Mads关于它 - 但这基本上是相关部分。)
答案 1 :(得分:2)
即使初始化表达式保证在"textual order"中,对于实例字段初始值设定项to access the this
reference也是非法的,并且您在
Dinner dinner = repo.GetDinner(5);
相当于
Dinner dinner = this.repo.GetDinner(5);
最佳实践IMHO,是将字段初始化保留为常量值或简单new
语句。任何比这更毛茸茸的东西都应该用于构造函数。