繁体   English   中英

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

[英]Why should I use implicitly typed local variables?

当我说

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吗?

谁的类型?

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

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

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

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

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

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

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

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

例:

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

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

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

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

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

可能是ReSharper。

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

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

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

批准的答案肯定是正确的,并回答了所描述的问题。

但是 - 我确实想提出一个必须使用隐式类型的情况:当变量表示匿名类型时。

考虑以下代码:

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

upperLowerWords应该是什么类型的? 你不能说,因为没有与返回的匹配的显式类型 - 但它是编译器可以识别的类型。 事实上,确实如此。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM