我为什么要使用隐式类型的局部变量?

Ash*_*Ash 14 c# resharper visual-studio

当我说

public static IMyType GetGateWayManager()
{
    IUnityContainer _container = GetContainer();
    IMyType _gateWayManager = _container.Resolve<IMyType>();
    return _gateWayManager;
}
Run Code Online (Sandbox Code Playgroud)

它带有警告说Use implicitly types local variable.

如果我改成它

public static IMyType GetGateWayManager()
{
    IUnityContainer _container = GetContainer();
    var _gateWayManager = _container.Resolve<IMyType>();
    return _gateWayManager;
}
Run Code Online (Sandbox Code Playgroud)

没事.

任何人都可以告诉我为什么VS编辑认为最好在这里使用var?

Gre*_*ech 13

谁的类型?

编译器?是的,一点没错.编译器使用类型来确保程序在运行时正常运行,确保类型匹配,调用实际存在的方法,并传递正确类型的参数.在这里,编译器正在检查您实际上是否返回了类型的东西IMyType.

编辑?再次,是的.编辑器使用后台编译和类型信息来帮助您编写代码.当你点击.之后_container,它使用类型信息来告诉你,有一个Resolve方法,什么参数需要.

您?没那么多.我们已经看到编译器会确保你返回一些类型的东西IMyType,那么为什么你要关心在编译器可以解决它并为你检查它时将它声明为该类型?类似地,编辑器会告诉你容器上的方法,所以你为什么要关心声明它是Unity容器还是其他类型的容器,鉴于你已经从变量名称知道它是某种容器,并且来自编辑,它有一个Resolve方法.

声明locals的类型没有问题,但ReSharper告诉你的是编译器可以解决它,因此它是冗余信息,并且你的代码可以通过隐式类型和良好的变量名更清晰.例如,此代码的目的是否比原始样本更清晰?

public static IMyType GetGateWayManager()
{
    var container = GetContainer();
    var gateWayManager = container.Resolve<IMyType>();
    return gateWayManager;
}
Run Code Online (Sandbox Code Playgroud)

  • 隐式类型有一个优点,即如果GetContainer的返回类型发生了更改(但保留了相同的签名),或者因为它被重命名,或者被替换为类似的类型,则上述代码不需要更改为应对.(虽然,它必须重建) (3认同)

小智 6

resharper建议使用var而不是显式类型,因为它清晰且有用.

清除,因为您编写的代码较少,而您的重点是变量名而不是类型名称.您可能认为类型名称很有用,但在很短的时间后您就会忘记它.

有用,因为当您更改方法类型返回时,您不需要更改所有类型.

例:

int id = getId();
List<MyType> myList = FindById(id);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果将id从int更改为guid,则必须在此处更改此"int".这很小,但在现实生活中很容易变大.使用var,您可以获得编译器的一些代码,并且不需要一直更改它.

var id = getId();
var myList = FindById(id);
Run Code Online (Sandbox Code Playgroud)

我以前更喜欢显式类型,但是在尝试var后几个小时我就不会那么容易了.

请记住:var在编译时更改为正确的类型.它与几乎在所有情况下都未被推荐的动力学不同.

  • 因此,看看您的第二个示例,仅查看FindById方法,将返回什么类型?您无法分辨,这就是隐式类型的缺点。 (2认同)

Eug*_*rda 5

可能是ReSharper.

ReSharper建议var在代码中看到变量类型时使用.在您的示例中,我们可以看到_gateWayManager将是类型IMyType,然后我们使用var 关键字来隐式输入变量._container将在代码中显式输入,因为我们不能说将返回什么类型的对象GetContainer()