2

可能重复:
在 C# 中使用 var 关键字
var 关键字的意义何在?

在使用隐式类型而不是显式类型时,我在这里有点困惑。

正如 MSDN 在 C# 编码标准中所引用的:

当变量的类型从赋值的右侧显而易见时,或者当精确类型不重要时,对局部变量使用隐式类型。

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

会有什么优势?

请帮助澄清我的疑问。

4

6 回答 6

5

take this as an example:

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

we can't determine the datatype of q here because it's generated at run time "anonymus-type"
and that is the main purpose of it

于 2012-10-09T07:11:50.570 回答
3

看看这个:

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关键字有一些缺点,嗯,有,但它们都在编译时。您的可执行文件一如既往地好。没错,var就是不一样object,,,,根本不一样!相反,它告诉编译器使用您分配给它的任何类型来声明变量。dynamicvariant

例如:

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

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

int x = 1;

嗯,三个原因:

  • 正如Star 提到的,有时您不知道类型。
  • 有时您只是不想输入类型(提示:查看此答案的开头)。
  • 有时您希望具有不需要告诉类型的灵活性。

这最后一点在创建文本转换模板或代码片段时特别有用,而且在您日常复制粘贴时也很方便。

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

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

现在您已将其更改为:

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

不好了!您现在必须更新 50 个课程。等什么?不,你没有!因为你一直在遵循那个说总是使用的建议var

注意:好的,不是现实的例子,但它仍然可以理解。

于 2012-10-09T07:34:02.367 回答
3

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

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

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

于 2012-10-09T07:07:12.107 回答
1

当您知道底层类型时,您从隐式类型变量中获得的唯一好处是,如果您更改原始类型(对于兼容的类型),则不必重新定义它们。

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

于 2012-10-09T07:09:36.720 回答
0

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

于 2012-10-09T07:05:17.553 回答
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 声明变量时,声明中的初始化程序是强制性的。此外,初始化器对其有一些限制,其中包括:

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

于 2012-10-09T07:09:12.087 回答