我不习惯使用Var隐式类型变量。任何人都可以让我知道使用这种变量的好处吗?任何隐含使用类型的优点var
回答
一件事是,它是long类型手短......如:
List<Dictionary<string, object>> myList = getList();
可以简化为:
var myList = getList();
只需交换现有代码与var,它可以回来,咬你。考虑一下:var list = new List
或者相反:IList
Annonymous类型:
var person = new { Name = "John", Surname = "Doe" };
在正常使用情况下,'var'完全是可选的,等同于手动指定类型。请参阅here。
但是,'var'关键字是anonymous types所必需的,我通常将它与LINQ结合使用。
我特别觉得更容易阅读本:
foreach(var dbitem in context.usp_GetUserAndAccountData())
{
txtUserName.Text = dbitem.UserName;
// ...
}
比这
foreach(ISingleResult<usp_GetUserAndAccountDataResult> dbitem in context.usp_GetUserAndAccountData())
{
txtUserName.Text = dbitem.UserName;
// ...
}
对于我来说,不管是什么我明确定义dbitem
,我还是会做同样的动作;所以var
这里是无价的!
它的美妙之处在于,智能感知仍然会在另一端列出所有预期类型的成员(例如我的示例中的UserName
)。
更好的代码可读性。
var anArray = new String[3];
var iStream = new InputStream(...);
var dict = new Dictionary<string, int>();
即使对于应该初始化为空值的变量,您也可以使用var关键字,如下所示:var dict = default(Dictionary
可读性的思想取决于。在你上面的例子中,这是真的。这更可读。但是,在您调用返回接口或类型不明确的函数的情况下,可能很难知道 - 未审查相关方法 - 您处理的是哪种类型,因此,我认为这不太可读。不是没有理由不使用var,但我不使用它,因为它可以单独读取...... – 2014-05-20 15:53:58
我相信这是对匿名类型的目的而创建(ALA Kugels为例):特别是构造函数和长型名称中使用
var person = new { Name = "John", Surname = "Doe" };
然而,因为我发现它,我不得不承认我发现它在每天的日常使用较长的类型名称打交道时非常有用,例如:
var aaa = new Dictionary<string, List<ReallyLongTypeName>>();
// vs
Dictionary<string, List<ReallyLongTypeName>> aaa = new Dictionary<string, List<ReallyLongTypeName>>();
另一个副作用是,类型名称可以改变(或与其他T为取代YPES),但使用var
不会”断裂,例如代码:
var item = this.GetItem();
this.Name = item.Name;
this.Age = item.Age;
只要从的GetItem返回值总是有一个属性Name
和属性Age
(其与this
属性兼容),则GetItems
可以返回一个完全不同的对象,上面的代码仍然可以编译。 (但要小心 - 现有的编译程序集不能使用相同的技巧!)
请注意,使用var并不总是它看起来(虽然主要是)。一个例子是这样的:
DataList控件是一个WebForm
foreach (var item in dataList.Items)
{
// item is of type System.Object
}
foreach (DataListItem item in dataList.Items)
{
// item is of type DataListItem
}
这只是因为在泛型之前的.net 2世界存在,而不是var关键字的限制。很高兴看到MS重新访问所有这些集合,并为它们添加一个IEnumerable接口。 – 2010-11-18 02:57:34
除了DataList控件,给我一个真正优势与外部代码打交道时,去耦变量类型实际的方法签名。
考虑这个接口:
public interface IFoo
{
List<Foo> GetSomething();
}
,说你有两行代码:
List<Foo> foos = fooRepo.GetSomething();
var foos2 = fooRepo.GetSomething();
上面两行相同的结果。 (返回List<Foo>
)。
现在,如果改变了接口:
public interface IFoo
{
Dictionary<bool,Foo> GetSomething();
}
第一行现在会抛出一个编译器错误,第二不会:
List<Foo> foos = fooRepo.GetSomething(); // error - can't convert from Dictionary<bool,Foo> to List<Foo>
var foos2 = fooRepo.GetSomething(); // works!
与库/其他项目时,这是非常方便的界面合同/方法签名可以改变。
是的,您仍然需要重新编译这些类,但是您不必返回并更改所有引用旧返回类型的代码。
如果外部库更改了它们的签名,您仍然需要重新编译所有库,因为在编译时var将被转换为具体类型,而后者将不再匹配。我仍然同意,在没有任何代码变化的情况下进行简单的重新编译是很好的,但只是为了清楚起见,因为可以通过阅读最后一行来得到var在运行时级别上的作用。 – 2010-11-18 03:00:08
是的 - @BurningIce,优点。是的,你需要重新编译 - 我所做的一点是你不需要回去修改所有的代码。 – RPM1984 2010-11-18 03:06:30
- 1. Haskell的类型类隐含
- 2. “传递任何内容时隐含任何?在任何类型的变量?类型参数
- 3. 不一致隐含有'任何'类型的错误
- 4. 变量a隐含有 '任何[]' 型
- 5. VAR类型的大LIMIT的缺点
- 6. 类型交点任何
- 7. LabelledGenerid.Aux隐含不使用函数体中的泛型类型时
- 8. Jinja2:如何识别任何循环之前的var类型
- 9. Scalaz`F [_]:Applicative`类型约束是如何隐含使用隐式参数的?
- 10. scala类型类隐含歧义
- 11. 使用一个隐含类型种姓是否改变变量的类型?
- 12. 打字稿 - 参数“U”隐含有一个“任意”类型
- 13. Angular2 - 参数$事件隐含有 '任意' 类型
- 14. 如何使用VAR任何功能
- 15. 使用类型注解函数文字的隐含参数
- 16. 隐含类型变量的javascript问题
- 17. “VAR” 类型推断
- 18. 如何使用任意类型的scala.util.Sorting.quickSort()?
- 19. 隐含通用列表<T>的数据类型是否可以隐含?
- 20. 如何找到toString()方法的用法隐含特定类型
- 21. 任何总是使用后缀'f'在C++中使用浮点数的优点?
- 22. C#var var有一个强类型?
- 23. (SAS)期权隐含波动率计算使用proc模型或任何程序
- 24. 使用var = {}()的含义的swift语法?
- 25. C#:ArgumentException的 - XYZ.DLL不包含任何用户控件类型
- 26. 函数类型在swift中作为参数类型的优点?
- 27. 使用LIKE优化sql查询%var%
- 28. 使用Int类型与整体约束。优点?
- 29. 有关使用EO模型优化查询的任何建议?
- 30. 元素隐含有'任何'类型,因为类型'计算机'没有索引签名
虽然从技术上讲,你问了一个不同类型的问题,请看[任何](http://stackoverflow.com/search?q= [C%23] + var)的其他问题和答案关键字'var'。你的问题可能会被认为是[this]的一个重复项目(http://stackoverflow.com/questions/1430831/anyone-found-a-use-of-var-other-than-for-linq)。 – 2010-11-18 02:23:54
我想知道是否可以通过将标题中的偏见换成“任何优势来明确拼出类型?”来获得不同的答案。 :-) – 2010-11-19 00:35:39
[在C#中使用var关键字]的可能重复(http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp) – nawfal 2014-07-15 14:31:00