Chr*_*ris 207 .net c# resharper var visual-studio
我刚刚开始在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);
Run Code Online (Sandbox Code Playgroud)
等,即使采用简单的类型,如int,bool等
为什么要推荐这个?我不是来自计算机科学或.NET背景,最近"陷入".NET开发,所以我真的很想了解正在发生的事情以及它是否有益.
Guf*_*ffa 281
ReSharper建议明显过度使用var关键字.您可以在类型明显的地方使用它:
var obj = new SomeObject();
Run Code Online (Sandbox Code Playgroud)
如果类型不明显,你应该写出来:
SomeObject obj = DB.SomeClass.GetObject(42);
Run Code Online (Sandbox Code Playgroud)
Mar*_*tta 184
一个原因是提高了可读性.哪个更好?
Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();
Run Code Online (Sandbox Code Playgroud)
要么
var dictionary = new Dictionary<int, MyLongNamedObject>();
Run Code Online (Sandbox Code Playgroud)
Bry*_*ard 96
我个人更喜欢关闭这个建议.使用var通常可以提高可读性; 但正如您所提到的,它有时会减少它(使用简单类型,或者当结果类型模糊时).
我喜欢选择何时使用var,何时不使用.但同样,那只是我.
Joh*_*n K 67
var可以提高代码的可读性,同时减少对代码的即时理解.同样,它可能会降低其他情况下代码的可读性.有时使用它是中性的.理解可读性的衡量标准不成比例,但取决于具体情况.有时两者一起增加或减少.
因素是var应用于什么以及目标如何支持立即将其数据类型混淆到读者,或者需要其类型信息来理解手头的程序部分.
例如,错误的命名可能导致var代码理解的减少.这不是var故障:
var value1 = GetNotObviousValue(); //What's the data type?
//vs.
var value2 = Math.Abs(-3); // Obviously a numeric data type.
Run Code Online (Sandbox Code Playgroud)
有时,var当代码在缺少时更具可读性时,使用简单数据类型是没有意义的:
var num = GetNumber(); // But what type of number?
// vs.
double num = GetNumber(); // I see, it's a double type.
Run Code Online (Sandbox Code Playgroud)
有时var隐藏数据类型信息是有用的,您不一定要关注以下复杂性:
IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG!
//vs.
var q = from t in d where t.Key == null select t;
// I simply want the first string, so the last version seems fine.
q.First().Key;
Run Code Online (Sandbox Code Playgroud)
您必须使用var时,有一个匿名类型存在,因为没有类型名称通过调用它:
var o = new { Num=3, Name="" };
Run Code Online (Sandbox Code Playgroud)
当您使用Visual Studio Intellisense提供类型信息时var,您需要通过严格的代码读取而不依赖于您的理解.假设不是每个人都拥有或使用Intellisense可能是明智的.
总结基于上面的例子,我建议全权申请var不是一个好主意,因为大多数事情最好是适度完成,并根据手头的情况,如此处所示.
为什么Resharper默认使用它?我建议放心,因为它无法解析情况的细微差别,以决定何时最好不要使用它.
Eri*_*est 39
在ReSharper(8.02,但可能是其他版本)中,通过首先打开ReSharper的选项菜单,可以根据您的喜好调整"使用隐式类型本地变量声明"建议的选项,无论可能是什么情况:

然后,在"代码检查"下通过调整所选语言的"检查严重性",在我的情况下c#:

如您所见,有一些选项可以调整ReSharper所做的所有建议.希望这能帮助像我这样已经拥有'var'使用策略的人,并希望ReSharper尊重它:)
Phi*_*ipp 23
我很惊讶没有人提到更改实例化对象的类型也更容易,因为
AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );
Run Code Online (Sandbox Code Playgroud)
是一种重复的形式.如果我想更改AVeryLongTypeName为其派生类之一,我只需要在使用时更改一次,var并且仍然可以访问子类的方法.
除此之外,改进的可读性是一个重点,但正如其他人所说,var不应该被过度使用,所以我认为在Resharper中关闭提示绝对没问题.
Lui*_*rez 23
'var'是清楚的
关于是否使用var关键字的主要争论在于代码对您和其他开发人员的可读性.
就像你在写一个故事一样,没有明确的正确答案.但让我们用简单的英语来看一些这方面的例子.
杰克向比尔打招呼.他不喜欢他,所以他转过身去了另一条路.
谁走了另一条路?杰克还是比尔?在这种情况下,使用名称"Jake"和"Bill"就像使用类型名称.而"他"和"他"就像使用var关键字一样.在这种情况下,它可能有助于更具体.以下例如更清楚.
杰克向比尔打招呼.杰克不喜欢比尔,所以他转身走了另一条路.
在这种情况下更具体地使句子更清楚.但事情并非总是如此.在某些情况下,具体使得阅读更难.
比尔喜欢看书,所以比尔去了图书馆,比尔拿出了比尔一直喜欢的书.
在这种情况下,如果我们使用"他"并且在某些情况下将所有名称全部遗漏,则更容易阅读该句子,这相当于使用var关键字.
比尔喜欢书,所以他去了图书馆并拿出了他一直喜欢的书.
这些例子涵盖了要点,但它们并不能说明整个故事.在这些例子中,只有一种方式可以引用这个人.要么使用他们的名字,要么使用像"他"和"他"这样的更通用的术语.
在代码的情况下,我们有3种方法可以帮助增加清晰度.类型,变量名称和赋值.以这行代码为例:
Person p = GetPerson();
Run Code Online (Sandbox Code Playgroud)
现在的问题是,在该行代码中是否有足够的信息来帮助您弄清楚发生了什么?
以下代码行怎么样?p在这种情况下你还会知道什么意思:
var p = GetPerson();
Run Code Online (Sandbox Code Playgroud)
现在怎么样:
var p = Get();
Run Code Online (Sandbox Code Playgroud)
或者现在:
var person = Get();
Run Code Online (Sandbox Code Playgroud)
或者这一个:
var t = GetPerson();
Run Code Online (Sandbox Code Playgroud)
或这个:
var u = Person.Get();
Run Code Online (Sandbox Code Playgroud)
关键字var在给定方案中的作用是否很大程度上取决于代码的上下文,例如变量,类和方法的命名方式.它还取决于代码的复杂性以及围绕它的其余代码.
就个人而言,我喜欢使用var关键字,大多数时候它对我来说更全面.但我也倾向于在类型之后命名我的变量,所以我并没有真正丢失任何信息.
也就是说,有时根据上下文我做出例外情况,这就是任何复杂事物的本质,如果不复杂,软件就没有任何意义.
Lia*_*amB 18
我也不喜欢这个.
我不希望这变成关于使用的辩论var,它有它的用途,但不应该在任何地方使用.
要记住的关键是ReSharper配置为您想要的任何编码标准.
小智 13
我看到很多正确的答案,但错过了完整答案.
确实,Resharper默认使用var.我想大多数人会同意这一点.当使用var并且类型很明显时(例如使用新语句时),它也更容易阅读.我看到一篇文章展示了如何更新检查严重性,仅显示使用var的提示.
我曾尝试评论其他帖子,首先添加设置这些帖子但没有声誉.显然我也没有发布我的设置截图的声誉.
我会解释如何到达那里.
在Visual Studio - >主菜单 - > Resharper - >选项 - >代码编辑 - > C# - >代码样式 - > Var用法声明
Sum*_*ans 13
我的规则是这样的:
你声明一个基本类型(即byte,char,string,int[],double?,decimal,等)? - >使用类型:
string myStr = "foo";
int[] myIntArray = [123, 456, 789];
double? myDouble = 123.3;
Run Code Online (Sandbox Code Playgroud)你声明的复杂类型(即List<T>,Dictionary<T, T>,MyObj)?- >使用var:
var myList = List<string>();
var myDictionary = Dictionary<string, string>();
var myObjInstance = new MyObj();
Run Code Online (Sandbox Code Playgroud)ReSharper推荐var,因为它倾向于整理对象创建.
比较这两个例子:
StringBuilder bld = new StringBuilder();
var bld = new StringBuilder();
Run Code Online (Sandbox Code Playgroud)
这只是一个应该更容易阅读的简写.
我认为用"new"明确创建新对象时很好.但是,在您的示例中,如果未正确命名类,则可能并不明显.
顺便说一句,ReSharper区分了"您可能希望将此建议应用于您的代码"和"您的代码已损坏,是否要我修复它?".该var关键字是建议类,与喜欢的东西"如果反转,以减少嵌套"一起; 你不必遵循它.
您可以通过"选项"对话框配置每个警报的烦恼程度,也可以直接通过该警报的弹出菜单进行配置.您可以降级var建议等内容,使其不那么突出,或者您可以升级"使用扩展方法"警报之类的内容,以便将其显示为实际错误.
瓦尔太棒了!我遇到过很多开发人员,他们的印象是var必须使用动态类型,但事实并非如此。它仍然是静态类型,只是由编译器决定。
以下是使用 var 的一些惊人的优点
\n\n键入较少的var 更短且更易于阅读,例如Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()Yuk。
\n var postcodes = new Dictionary<int,IList<string>>()\\o/\\o/\n
\n更多描述性变量名称- 脆弱的名称,但我认为让流动性var在这里闪耀很重要。虽然var有点模糊,但它确实鼓励使用更具描述性的变量名称,而不是让类型自己说话。
\n更少的代码更改- 如果方法调用的返回类型发生更改。您只需更改方法调用,而不是使用它\xe2\x80\x99s 的每个地方。
\n匿名类型- 匿名类型是一个非常强大的概念,特别是在 WebApi部分资源等领域等领域。没有 var,它们就无法使用。
然而,有时显式声明类型很有用,我发现这在基元或结构中最有用。例如,我个人认为这种语法不是很有用:
\n\nfor(var i = 0; i < 10; i++) \n{\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n与
\n\nfor(int i = 0; i < 10; i++) \n{\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这完全取决于个人喜好,但使用var真正使用将加速您的发展并解锁整个匿名类型的善良世界。
| 归档时间: |
|
| 查看次数: |
49610 次 |
| 最近记录: |