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

时间:2010-08-27 08:34:43

标签: c# visual-studio resharper

当我说

public static IMyType GetGateWayManager()
{
    IUnityContainer _container = GetContainer();
    IMyType _gateWayManager = _container.Resolve<IMyType>();
    return _gateWayManager;
}

它附带警告Use implicitly types local variable

如果我将其更改为

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

很好。

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

6 个答案:

答案 0 :(得分:13)

谁是哪种类型?

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

编辑?再次,是的。编辑器使用后台编译和类型信息来帮助您编写代码。当您在.之后点击_container时,它会使用类型信息告诉您有Resolve方法以及所需的参数。

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

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

public static IMyType GetGateWayManager()
{
    var container = GetContainer();
    var gateWayManager = container.Resolve<IMyType>();
    return gateWayManager;
}

答案 1 :(得分:6)

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

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

很有用,因为当你更改方法类型返回时,你不需要改变所有类型。

示例:

int id = getId();
List<MyType> myList = FindById(id);

在这种情况下,如果将id从int更改为guid,则必须在此处更改此“int”。这很小,但在现实生活中很容易变大。使用var,你可以很好地使用编译器的一些代码,而不需要总是更改它。

var id = getId();
var myList = FindById(id);

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

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

答案 2 :(得分:5)

可能是ReSharper。

当代码中可以看到变量类型时,ReSharper建议使用var。在您的示例中,我们可以看到_gateWayManager的类型为IMyType,然后我们使用var关键字来隐式输入变量。 _container将在代码中显式输入,因为我们无法说明GetContainer()将返回哪种类型的对象

答案 3 :(得分:2)

这可能不是VS编辑器,而是ReSharper给你的消息。这不仅仅是品味而非最佳实践。但是一旦习惯了var关键字,你就会越来越喜欢它。至少我已经学会了喜欢它。

答案 4 :(得分:1)

这是Resharper警告你,而不是VS编辑。

答案 5 :(得分:0)

批准的答案肯定是正确的,并且按照说明回答问题。

但是-我确实想提出一个案例,其中您必须使用隐式类型:当变量表示匿名类型时。

考虑以下代码:

var upperLowerWords =
    from w in words
    select new { Upper = w.ToUpper(), Lower = w.ToLower() };

upperLowerWords应该是什么类型?您不能说,因为没有与返回值匹配的 explicit 类型-但这是编译器可以识别的类型。而且,实际上确实如此。

作为参考:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables(这是我得到的示例)