c# - license - resharper中文




为什么ReSharper想为所有的东西使用'var'? (15)

我刚刚开始在Visual Studio中使用ReSharper(在SO之后的许多建议之后)。 为了尝试它,我打开了一个最近的ASP.NET MVC项目。 我已经注意到它建议的第一个也是最常见的事情之一是将大部分/全部显式声明改为var 。 例如:

//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

等等,即使是简单的类型,如intbool

为什么这是建议? 我不是来自计算机科学或.NET背景,最近“陷入”了.NET开发,所以我真的很想了解正在发生的事情以及它是否有好处。


.Net 3.0的var特性只是类型推断 ,它是类型安全的,并且通常会使代码更易于阅读。 但是,如果你愿意的话,你不必这样做,并且可以用建议的方式关闭这个建议。


ReSharper建议var,因为它倾向于整理对象的创建。

比较这两个例子:

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

这只是一个简单的应该更容易阅读。

当你用“新”明确地创建新对象时,我认为这很好。 然而,在你的例子中,如果类没有正确命名,它可能并不明显。


Var很棒! 我遇到过很多开发人员,他们认为var绑定到动态类型,但事实并非如此。 它仍然是静态类型的,它只是由编译器决定的。

以下是使用var的一些惊人的优点

例如,较少输入 var变得更短并且更易于阅读

Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>() Yuk。

var postcodes = new Dictionary<int,IList<string>>() \ o / \ o /

更具描述性的变量名称 - 纤细的变量名称 ,但我认为让变量的流动特性在这里变得非常重要。 由于var有点模糊,它的确会鼓励一个更具描述性的变量名称,而不是让类型自己说话。

更少的代码更改 - 如果方法调用的返回类型更改。 您只需更改方法调用,而不是每个使用的地方。

匿名类型 - 匿名类型是一个非常强大的概念,特别是在诸如WebApi 部分资源等领域。 没有var,他们不能使用。

但有时候,明确声明类型是有用的,我发现这在基元或结构中最有用。 例如,我个人觉得这个语法非常有用:

for(var i = 0; i < 10; i++) 
{

}

VS

for(int i = 0; i < 10; i++) 
{

}

这完全取决于个人偏好,但使用var真的会加速你的发展,并打开一个匿名类型善良的整个世界。


var关键字是在C#3.0中引入的 - 它允许我们忘记明确指定我们的类型。

你是否使用没有真正的区别

MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

要么

var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

纯粹的可读性和更少的错误机会除外。

这似乎是一个陈词滥调的例子,但说下面的内容可能有助于你的理解:

var myInt = 23;

返回一个int类型,而

var myInt = "23";

返回一个string类型。

MSDN参考


'var'即将清晰

关于是否使用var关键字的主要争论是关于代码对您和其他开发人员的可读性。

就像你写故事一样,没有确切的正确答案。 但让我们以简单的英文来看看这个例子。

杰克和比尔问好。 他不喜欢他,所以他转过身去了另一条路。

谁去了另一条路? 杰克还是比尔? 在这种情况下,使用名称“Jake”和“Bill”就像使用类型名称一样。 而“他”和“他”就像使用var关键字一样。 在这种情况下,它可能有助于更具体。 例如以下更清晰。

杰克和比尔问好。 杰克不喜欢比尔,所以他转过头去了另一条路。

在这种情况下,更明确地使句子更清楚。 但这并非总是如此。 在某些情况下,特定情况会使阅读变得更加困难。

比尔喜欢书,所以比尔去图书馆,比尔拿出一本比尔一直喜欢的书。

在这种情况下,如果我们使用“he”,并且在某些情况下将他的名字全部排除在外,则更容易阅读该句子,这相当于使用var关键字。

比尔喜欢书,所以他去图书馆拿出一本他一直喜欢的书。

这些例子涵盖了要点,但他们没有说出整个故事。 在这些例子中,只有一种方法可以提到这个人。 要么使用他们的名字,要么使用一个更加通用的术语,如“他”和“他”。

在代码的情况下,我们有3种方法来帮助增加清晰度。 类型,变量名称和赋值。 以这行代码为例:

Person p = GetPerson();

现在的问题是这行代码中有足够的信息来帮助你弄清楚发生了什么?

以下代码行呢? 你会在这种情况下仍然知道p含义:

var p = GetPerson();

现在怎么样:

var p = Get();

或现在:

var person = Get();

或者这个:

var t = GetPerson();

或这个:

var u = Person.Get();

关键字var在给定场景中是否有效取决于代码的上下文,如变量,类和方法的命名方式。 它还取决于代码的复杂性和其周围的代码的其他部分。

就我个人而言,我喜欢使用var关键字,这在大多数情况下对我来说更全面。 但是我也倾向于在类型之后命名我的变量,所以我没有真正失去任何信息。

这有时候取决于我作出例外的情况,这就是任何复杂的本质,而且软件不是复杂的东西。


在我看来,只有在定义变量的值时立即清除类型是什么时才应使用var

例:

var s = "string value";

很明显, s是一个string

我相信当变量类型名称非常复杂时也是适用的。

例:

Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

// This is a little easier to read than the above statement
var dict = Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

除了这些场景之外,我没有看到使用var GAIN,但是我可以想到一些可能有害的场景:

例如,一个一次性类型的右侧变量值没有清楚地显示类型。 丢弃IDisposable很容易被遗忘

例:

// returns some file writer
var wr = GetWriter();

wr.add("stuff");
wr.add("more stuff");

//...
//...

// Now `wr` needs to be disposed, 
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.

在ReSharper(8.02,但可能是其他版本)中,通过首先打开ReSharper的选项菜单,可以根据您的偏好调整“使用隐式类型化局部变量声明”建议的选项 ,无论如何。

然后,在“代码检查”下,通过调整所选语言的“检查严重性”,在我的案例中c#:

正如你所看到的,有些选项可以调整ReSharper制作的所有建议。 希望这可以帮助像我这样已经拥有'var'使用策略并且只希望ReSharper尊重它的人:)


对于那些不喜欢不断使用“var”的人:

注意:你也可以在做“引入变量”时停止从默认var到resharper。 这让我很长时间感到沮丧,它总是默认为var,我每次都在改变它。

这些设置在Code Editing - > C# - > Code Style下


我也不喜欢这个。

我不希望这变成关于使用var的争论,它有它的用途,但不应该到处使用。

要记住的关键是ReSharper被配置为任何你想要的编码标准。

编辑: ReSharper和var


我只想指出,在C#代码约定中,当“变量的类型明显来自赋值的右侧,或者当精确类型不重要”时,建议使用“var”,这样可能为什么在ReSharper中默认打开提示。 它们还提供了一些在同一文档中不会提高可读性的情况。


我的规则是这样的:

  • 你是否声明了一个原始类型(即bytecharstringint[]double?decimal等)? - >使用类型:

    string myStr = "foo";
    int[] myIntArray = [123, 456, 789];
    double? myDouble = 123.3;
    
  • 你是否声明了一个复杂类型(即List<T>Dictionary<T, T>MyObj )? - >使用var

    var myList = List<string>();
    var myDictionary = Dictionary<string, string>();
    var myObjInstance = new MyObj();
    

我看到很多正确的答案,但错过了完整的答案。

确实,Resharper默认情况下会过度使用var。 我想大多数人会同意这一点。 当使用var时,读取也更容易,并且类型很明显,比如当您使用新语句时。 我看到一篇文章展示了如何更新检查严重性以仅显示使用var的提示。

我曾试着首先对其他帖子发表评论,以添加设置这些内容的位置,但没有声名。 显然,我也没有声望发布设置的截图。

我将解释如何到达那里。

在Visual Studio中 - >主菜单 - > resharper - >选项 - >代码编辑 - > C# - >代码样式 - > Var在声明中的用法

  • 对于内置类型使用显式类型
  • 对于简单类型当明显时使用'var'
  • 其他地方Use'var'


根据JetBrains(ReSharper的作者)的说法,他们鼓励在默认情况下使用var。

从他们的website

使用C#3.0中引入的隐式类型局部变量(也称为var关键字)已经变得非常流行,因为提高了代码的可读性。 默认情况下,ReSharper还鼓励使用var关键字,但其使用偏好可灵活配置。 例如,您可以选择在特定情况下或在任何地方使用显式类型。


没有技术上的区别(正如eWolf指出的那样)。 你可以使用其中一个,生成的CLR代码看起来是一样的。

在我看来,主要的好处是,这往往会迫使你使用更好的变量命名。 在你的例子中,'foo'对于一个变量名是一个相当差的选择。


顺便说一句,ReSharper在'你可能想要将这个建议应用于你的代码'和'你的代码坏了,想要我解决它?'之间进行区分。 var关键字在建议类别中,以及诸如“反转如果减少嵌套”; 你不必遵循它。

您可以通过“选项”对话框或直接通过该警报的弹出菜单配置恼人每个警报的方式。 您可以降级诸如var建议之类的东西,使它们不那么突出,或者您可以升级诸如“使用扩展方法”警报之类的东西,使其显示为实际错误。





var