Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 专用只读接口-是否冗余?_C#_.net_Dependency Injection - Fatal编程技术网

C# 专用只读接口-是否冗余?

C# 专用只读接口-是否冗余?,c#,.net,dependency-injection,C#,.net,Dependency Injection,我正在为我的项目使用IoC和DI 但是,我想知道,拥有以下内容是否是一种好的做法: private readonly IMyService myservice; 作为服务使用者的类中的字段。该字段在构造函数中设置 我肯定我在什么地方见过这个,而且我已经学会了。 然而,我也看到: private IMyService myservice; 这似乎足够了。为注入的服务接口提供一个只读字段有什么用途吗?优点是什么?Areadonly字段表示只能在ctor中写入。一旦完成,就不能更改或销毁引用。它对

我正在为我的项目使用IoC和DI

但是,我想知道,拥有以下内容是否是一种好的做法:

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要容易得多


简言之,是的,如果在构建对象后不进行更改,那么声明某个对象是一种好的做法,因为它可以防止所有未来的作者犯这种错误。

使用接口是一种好的做法还是多余的做法?它与接口无关!