C# var 关键字
var 是3.5新出的一个定义变量的类型,可代替任何类型,编译器会根据上下文来判断你到底是想用什么类型
比如写出如下代码:
var name = "水杯";
var price = 19.9;
var buy = true;
编译器会自动识别出变量name、price、buy的类型,如下图所示:



使用控制台输出它们的类型
Console.WriteLine($"name的类型:{name.GetType()}rn" +
$"price的类型:{price.GetType()}rn" +
$"buy的类型:{buy.GetType()}rn");
控制台输出的结果如下图所示:

对于很多的局部变量,我们都可以用var来声明,这样可以让我们更关注变量的语义而不用分心去考虑其类型,因为编译器会给我们选择合适的类型,但是不能滥用这种方式,因为会导致难于阅读,甚至可能产生微妙的类型转换bug,那么什么时候该用什么时候不该用呢?
C#使用var关键字的建议
在很多情况下,局部变量的类型完全可以从初始化语句看出来,这时候为了简化代码,完全可以使用var
示例代码如下所示:
MyType mytype = new MyType();
可以替换为:
var mytype = new MyType();
如果用工厂方法的返回值来初始化某个变量,那么其类型通常也是显而易见的
var thing = AccountFactory.CreateAccount();
某些方法的名称没有清晰地指出返回值的类型,例如
var result = someObject.DoSomeWork(anotherParameter)
这时候只要修改变量的名称,就能令代码变得清晰:
var HighestSellingProduct = someObject.DoSomeWork(anotherParameter)
尽管方法名本身没有指出返回的类型,但是我们可以很容易的推测出该变量的类型应该是Product
但是在有些时候使用var会触发各种形式的转换,有些转化是宽化转换(widening conversion)这种转化是安全的,例如float到double,而有些转化是窄化转换(narrowing converion)这种转化会让精度下降,例如从long到int的转换就会产生这个问题。如果我们明确地写出数值变量所应具备的类型,那么就可以更好地加以控制,而且编译器也会给出相应的提醒。
var f = GetMagicNumber();
var r = 100 * f / 6;
r的类型受到f的类型的影响,如果f为double类型,那么r也为double类型
比较一下下列两段代码的区别:
public IEnumerable<string> FindCustomersStartingWith1(string start)
{
IEnumerable<string> q =
from c in Customers
select c.ContactName;
var q2 = q.Where(s => s.StartsWith(start));
return q2;
}
public IEnumerable<string> FindCustomersStartingWith1(string start)
{
var q =
from c in Customers
select c.ContactName;
var q2 = q.Where(s => s.StartsWith(start));
return q2;
}
上一段代码设定了q的类型为IEnumerable
访问数据库中返回值实际上是IQueryable
这样时候使用var编译器给出的自动推导类型是IQueryable
参考:《Effective C#》——Bill Wagner
原文始发于微信公众号(DotNet学习交流):C# var 关键字以及使用建议
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/230898.html