为了账号安全,请及时绑定邮箱和手机立即绑定

在C#中使用var关键字

在C#中使用var关键字

九州编程 2019-05-30 12:42:34
在C#中使用var关键字在与同事讨论了在C#3中使用‘var’关键字之后,我想知道人们对通过var进行类型推断的适当使用有什么看法?例如,我在有问题的情况下懒洋洋地使用var,例如:-foreach(var item in someList) { // ... } // Type of 'item' not clear.var something = someObject.SomeProperty;  // Type of 'something' not clear.var something = someMethod(); // Type of 'something' not clear.更合理地使用var的方法如下:var l = new List<string>(); // Obvious what l will be.var s = new SomeClass(); // Obvious what s will be.有趣的是,LINQ似乎有点灰色,例如:-var results = from r in dataContext.SomeTable               select r; // Not *entirely clear* what results will be here.很清楚结果是什么,因为它将是一种实现IEnDigable的类型,但是在声明新对象的var的方式上,这并不是完全显而易见的。更糟糕的是,当涉及LINQto对象时,例如:-var results = from item in someList              where item != 3               select item;这并不比等量的preach(在某些列表中的var项){/.)等价物。这里有一个关于类型安全性的真正关注-例如,如果我们将该查询的结果放置到一个重载的方法中,该方法接受IEnDigable<int>和IEnDigable<Double>,调用者可能会无意中传递错误的类型。var 是吗?保持强类型,但问题是类型在定义上不立即显现是否危险,当重载意味着当您无意地将错误类型传递给方法时,这种情况会被放大。
查看完整描述

4 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

我还是觉得var在某些情况下可以使代码更易读。如果我有一个带有Orders属性的Customer类,并且我想将它赋值给一个变量,我只需要这样做:

var orders = cust.Orders;

我不在乎顾客。订单是IEnumerable<Order>ObservableCollection<Order>BindingList<Order>-我只想把这个列表保存在记忆中,然后迭代它,或者得到它的计数或其他东西。

将上述声明与下列声明进行对比:

ObservableCollection<Order> orders = cust.Orders;

对我来说,这个类型的名字就是噪音。如果我回去决定改变客户的类型。ObservableCollection<Order>IList<Order>)然后我也需要修改声明-如果我一开始就使用var,我就不用修改声明了。


查看完整回答
反对 回复 2019-05-30
?
湖上湖

TA贡献2003条经验 获得超2个赞

我用var广泛地。有人批评说,这会降低代码的可读性,但没有理由支持这种说法。

诚然,这可能意味着不清楚我们正在处理的是哪种类型的问题。那又怎么样?这实际上是解耦设计的要点。在处理接口时,您强调的是对变量的类型感兴趣。var更进一步,没错,但我认为从可读性的角度来看,这个论点是一样的:程序员实际上不应该对变量的类型感兴趣,而应该对变量的类型感兴趣。是吗?。这就是为什么微软也称类型推断为“鸭子输入”。

所以,当我使用var?很简单,不管IntelliSense告诉我什么都行。任何忽略IDE的关于C#的推理都不符合现实。实际上,每个C#代码都是在支持IntelliSense的IDE中编写的。

如果我使用的是var声明变量并混淆变量的存在,我的代码有一些根本问题。var不是病因,它只会使症状明显。别怪信使。

现在,C#团队发布了一份编码指南,声明var用于捕获创建匿名类型的LINQ语句的结果(因为在这里,除了var)。去他的吧。只要C#团队没有给我一个合理的理由来支持这个准则,我就会忽略它,因为在我的职业和个人看来,这纯粹是胡说八道。(对不起,我没有相关指南的链接。)

实际上,有一些(表面上)好解释为什么你不应该用var但我仍然认为他们在很大程度上是错误的。以“searchabililty”为例:作者声称var很难找到MyType被利用了。右(边),正确的。接口也是如此。实际上,我为什么要知道这个类是在哪里使用的呢?我可能更感兴趣的是它在哪里被实例化,这仍然是可搜索的,因为在某个地方必须调用它的构造函数(即使这是间接的,类型名称也必须在某个地方被提及)。


查看完整回答
反对 回复 2019-05-30
?
慕容森

TA贡献1853条经验 获得超18个赞

在我看来,在C#中好东西TM。任何这样类型的变量仍然是强类型的,但是它从定义它的赋值的右边获得它的类型。因为类型信息在右边是可用的,所以在大多数情况下,也必须在左侧输入类型信息是不必要的,而且过于冗长。我认为这大大提高了可读性而不降低类型安全性。

在我看来,从可读性角度看,对变量和方法使用良好的命名约定比显式类型信息更重要。如果我需要类型信息,我总是可以悬停在变量(在VS中)并得到它。但是,通常情况下,对于读者来说,显式类型信息不应该是必需的。对于开发人员来说,无论变量是如何声明的,在VS中仍然可以获得IntelliSense。尽管如此,在某些情况下,显式声明类型仍然是有意义的-也许您有一个返回List<T>,但你想把它当作IEnumerable<T>用你的方法。为了确保您使用的是接口,声明接口类型的变量可以使其显式化。或者,你可能想声明一个没有初始值的变量-因为它会立即得到一个基于某种条件的值。在这种情况下,你需要类型。如果类型信息有用或必要,请继续使用它。不过,我觉得这通常是不必要的,而且在大多数情况下,没有它的代码更容易阅读。


查看完整回答
反对 回复 2019-05-30
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

这两种说法都不是绝对正确的;var对可读性有积极和消极的影响。照我的想法,var当下列任何一项为真时,应使用:

  1. 这种类型是匿名的(嗯,你在这里别无选择,因为它

    在这种情况下是可变的)
  2. 根据指定的表达式(即

    var foo = new TypeWithAReallyLongNameTheresNoSenseRepeating())

var没有任何性能影响,因为它的语法糖;编译器推断和定义类型,一旦它被编译成IL;没有什么其实关于它的动态。


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信