c#.Net中“var”关键字的意义是什么?

时间:2012-10-09 07:04:42

标签: c# var

  

可能重复:
  Use of var keyword in C#
  What's the point of the var keyword?

在使用隐式输入而不是显式输入时,我有点困惑。

MSDN在C#编码标准中引用:

  

当变量的类型时,对局部变量使用隐式类型   从任务的右侧,或精确的时候是显而易见的   类型并不重要。

我的问题是,当我们已经知道底层变量类型时,为什么我们需要在这里使用隐式类型?

有什么好处?

请帮助澄清我的疑问。

6 个答案:

答案 0 :(得分:5)

以此为例:

var q = from c in myCollection
        select new
    { c.Value1, c.Value2 };

我们无法在此确定q的数据类型,因为它是在运行时生成的“anonymus-type”
这就是它的主要目的

答案 1 :(得分:3)

  

当我们已经知道底层变量类型时,为什么我们需要   在这里使用隐式输入?有什么好处?

只是为了编码方便,快速打字,如果你愿意,再加上你的行更短

最后,在这种情况下,类型在分配的右侧侧可见。

答案 2 :(得分:1)

当您知道基础类型时,从隐式类型变量中获得的唯一优势是,如果您更改原始类型(对于兼容的类型),则无需重新定义它们。

基本上,隐式类型变量的最大优点是分配往往很长且不断变化的类型(如linq enumerables或queryables)

答案 3 :(得分:1)

看看这个:

Collection<KeyValuePair<Predicate<T>, Action<T>>> x = 
new Collection<KeyValuePair<Predicate<T>, Action<T>>>();

现在看看这个:

var x = new Collection<KeyValuePair<Predicate<T>, Action<T>>>();

而且,我敢,我敢说你,告诉我使用var关键字没有任何冒险。

注意:这是基于某个项目中的实际声明而我没有提及。

有可能你认为使用var关键字有一些缺点,有,但是它们都在编译时。您的可执行文件一如既往。这是正确的varobjectdynamicvariant不同,完全没有!相反,它告诉编译器使用您分配给它的类型声明变量。

例如:

var x = 1;
x  = "something"; //Error!!!

好的,这可能听起来很傻。 “我知道这种类型” - 你说 - “为什么我不能把它放下来?” - 你问 - “看,很容易:”

int x = 1;

好吧,有三个原因:

  • 有时您不知道类型,Star mentions
  • 有时你只是不想输入类型(提示:看看这个答案的开头)。
  • 有时您希望能够灵活地不需要告诉类型。

最后一点尤其在创建文本转换模板或代码片段时非常方便,但在日常复制粘贴中也是如此。

然而,只要考虑一下你是否改变了一些神秘方法的返回类型......说你有:

List<string> MamboJambo()
{
    //...
}

现在您已将其更改为:

IList<string> MamboJambo()
{
    //...
}

哦,不!您现在必须更新50个课程。等什么?不,你没有!因为您一直遵循该建议,即始终使用var

注意:好的,不是现实的例子,它仍然可以解决问题。

答案 4 :(得分:0)

它声明了一个隐式类型变量。也就是说,在编译时它将自己确定类型,因此您不必键入它。 它的主要目的是声明一个变量,例如你想要一个anonymus方法。基本上它允许你输入less,仅此而已,从代码阅读器的角度来看它更好尽可能指定确切的类型。

答案 5 :(得分:0)

var关键字用于变量声明而不是类型。 var的技术术语是“隐式类型的局部变量声明。”变量本身仍然是静态类型的(类型是在编译代码时确定的),并且它仍然是强类型的(一旦声明它就不能改变类型) 。不同之处在于我们不再在源代码中明确声明变量的类型;相反,编译器根据变量的初始化推断变量的类型。例如:

var maxValue = 500;    
var customerFirstName = "Jimmy";
var stopwatch = new System.Timers.Timer();

在此示例中,maxValue使用System.Int32类型编译,customerFirstName是System.String,秒表是System.Timers.Timer。如果不明显,当使用var声明变量时,声明中的初始值设定项是必需的。此外,初始化程序对它有一些限制,包括以下内容:

它必须是一个返回值类型的表达式;例如,匿名函数声明(如lambdas)无效,但允许使用文字表达式和对象构造函数。     它不能返回null类型。     它不能引用声明的变量。     每个声明只允许一个声明;不允许多个声明。 更多: http://www.techrepublic.com/blog/programming-and-development/code-concepts-cs-var-keyword/1461