【问题标题】:What is the significance of "var" keyword in c#.Net? [duplicate]c#.Net中“var”关键字的意义是什么? [复制]
【发布时间】:2012-09-29 11:03:18
【问题描述】:

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

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

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

当变量的类型为局部变量时使用隐式类型 从作业的右侧很明显,或者当精确的 类型并不重要。

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

有什么好处?

请帮助澄清我的疑问。

【问题讨论】:

  • 优点也是节省击键次数,当您的方法返回类型非常复杂和/或通用(例如MyVeryComplexGenericType<string, KeyValuePair<int, List<object>>>;)时,您只需使用var就可以节省一些空间。
  • 在SO上已经讨论过很多次了,here,here,here,here
  • 另请注意,您并不总是知道类型(例如,如果它是匿名的)。

标签: c# var


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

例如:

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

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

int x = 1;

嗯,三个原因:

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

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

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

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

现在您已将其更改为:

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

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

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

【讨论】:

    【解决方案2】:

    以此为例:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          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

          【讨论】:

          • 我知道您只是试图解释var 的使用,并没有推荐它,但在我看来,这些都是很好的例子不使用@987654324 @。在第一个 500 的情况下,它也可能是 uint 或 short 甚至是 ushort,大多数开发人员不确定是哪一个。在变量秒表的最后一种情况下,我希望System.Diagnostics.Stopwatch 类型的变量不是计时器,因此在行首的提示肯定会有所帮助。
          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-17
            • 2011-05-17
            • 2020-10-11
            • 1970-01-01
            • 2012-04-04
            • 1970-01-01
            • 2018-09-21
            相关资源
            最近更新 更多