C# 专用只读接口-是否冗余?
我正在为我的项目使用IoC和DI 但是,我想知道,拥有以下内容是否是一种好的做法:C# 专用只读接口-是否冗余?,c#,.net,dependency-injection,C#,.net,Dependency Injection,我正在为我的项目使用IoC和DI 但是,我想知道,拥有以下内容是否是一种好的做法: private readonly IMyService myservice; 作为服务使用者的类中的字段。该字段在构造函数中设置 我肯定我在什么地方见过这个,而且我已经学会了。 然而,我也看到: private IMyService myservice; 这似乎足够了。为注入的服务接口提供一个只读字段有什么用途吗?优点是什么?Areadonly字段表示只能在ctor中写入。一旦完成,就不能更改或销毁引用。它对
private readonly IMyService myservice;
作为服务使用者的类中的字段。该字段在构造函数中设置
我肯定我在什么地方见过这个,而且我已经学会了。
然而,我也看到:
private IMyService myservice;
这似乎足够了。为注入的服务接口提供一个只读字段有什么用途吗?优点是什么?A
readonly
字段表示只能在ctor中写入。一旦完成,就不能更改或销毁引用。它对于初始化状态和强制执行不变性非常有用。它是一个接口这一事实与此无关。对字段应用readonly
修饰符可防止您(或其他人)在构建对象后更改其值。它只能在构造函数中赋值。在字段上设置readonly
的优点是它明确声明字段在包含实例的生命周期内不会更改。在许多情况下,这使得对给定方法的行为进行推理变得更容易。比如说
void Method() {
var marker = myservice.StartOperation();
try {
SomeOtherMethod();
} finally {
myservice.StopOperation(marker);
}
}
假设startoOperation
和StopOperation
是必须在给定的IMyService
实例上成对调用的方法。当myservice
是一个readonly
字段时,您只能查看此函数,并对满足此合同有高度信心
但是,如果它不是
readonly
,则必须立即怀疑SomeOtherMethod
以及从该函数传递调用的所有其他方法。如果他们中的任何一个能够突然重置myservice
字段,那么你就会违反合同,并最终导致一些非常微妙的错误 > P> >我认为使用<代码> Read Ong/Cuth>关键字是正确执行构造函数注入的中心部分。
public class MyClass
{
private readonly IMyService myservice;
public MyClass(IMyService myservice)
{
if (myservice == null)
{
throw new ArgumentNullException("myservice");
}
this.myservice = myservice;
}
}
在技术上,实现构造函数注入既不需要readonly
关键字,也不需要Guard子句。然而,它们都有助于增强类的不变量
当应用于类中的字段时,readonly
向读者指示“此字段在该实例的生命周期内不会更改”。这是非常有用的依赖项信息,在构造函数中接收到依赖项后不会更改
错误地试图更改依赖项会导致编译时错误,提醒您或其他正在修改类的人注入的依赖项不应更改。这比省略readonly
关键字,然后由于重新分配而不得不跟踪bug要容易得多
简言之,是的,如果在构建对象后不进行更改,那么声明某个对象是一种好的做法,因为它可以防止所有未来的作者犯这种错误。使用接口是一种好的做法还是多余的做法?它与接口无关!