【问题标题】:Is var more resource intensive than explicitly typed variables?var 是否比显式类型的变量更占用资源?
【发布时间】:2017-05-26 04:57:07
【问题描述】:

所以我和我的一些同事正在研究 var 的用法以及为什么我们应该/不应该使用它。

我想知道 var 是否比显式类型变量更占用资源?

据我了解,它只是一个非常动态的变量,并且会(作用相同/使用相同数量的资源)与传递给 var 的任何其他显式类型变量一样。

能否请对此主题有更多了解的人详细说明?

提前致谢!

【问题讨论】:

  • 不,不是,只是开发人员的糖语法..
  • var 不是动态的。在编译类型时,变量的类型是确定的。运行时不会消耗额外的资源。
  • 在大多数情况下,var 无论如何都会被编译为特定类型,所以不,它不会占用更多资源
  • var 在正确类型的语言中似乎很懒惰,我尽量避免使用它,但实际上我相信它只是一个简单的偏好。
  • @YacoubMassad 动态我的意思是,你传递给它的类型就是它的类型......所以如果我传递 var foo = bar(); ....bar 可以是任何东西

标签: c# variables resources var


【解决方案1】:
using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main()
        {
            var stringImplicit = "Blah";
            string stringExplicit = "Blah";

            Console.WriteLine("IMPLICIT : {0} - {1}", stringImplicit, stringImplicit.GetType().Name);
            Console.WriteLine("EXPLICIT : {0} - {1}", stringExplicit, stringExplicit.GetType().Name);

            Console.ReadKey();
        }
    }
}

不管怎样,你可以看到它们变得相同。如果您查看 IL(中间语言 - 编译代码),您会看到完全相同的“字节码”。您所做的只是要求编译器解决它。一旦编译完成,这种计算类型的“努力”就不再存在了。

【讨论】:

    【解决方案2】:

    隐式类型局部变量的强类型是在编译时确定的,因此在运行时对应用程序性能的影响为零。

    var 关键字简化了开发人员必须在变量声明中键入完整对象名称的任务。

    重要的是要理解 var 关键字并不意味着“变体”,也不表示该变量是松散类型或后期绑定的。它只是意味着编译器确定并分配最合适的类型。 - Implicitly Typed Local Variables (C# Programming Guide)

    【讨论】:

      【解决方案3】:

      Var 只是显式写出类型的语法糖。它为您节省了一些输入,也意味着如果您更改分配类型,那么您不需要更新您的变量声明。

      例如,如果您有以下代码:

              var s = "My String";
      
              String t = "My String";
      

      然后使用ILSpy 反编译它,s 最初声明为var 的事实丢失了。当编译器生成 IL 时,它意识到变量 s 是一个字符串,因此将 var 替换为 String

      【讨论】:

      • 它必须确定“s”确实是一个字符串而不是在启动时消耗资源从而延长程序启动时间的事实吗?
      • 没有。 varNOT 动态类型。它是隐式 STATIC 类型。就像任何其他具有隐式静态类型的语言一样,无论是 ML、Haskell、Scala、C++、Kotlin、Ceylon、Rust、Swift、Java 还是无数其他语言。 什么都没有在运行时发生。在具有统一和回溯的强大的全程序类型推断的语言中,它可能减慢编译时间,但C♯的类型推断是如此基本和微不足道,以至于它的影响不明显。无论如何,编译器必须计算 RHS 的类型以检查分配是否合法。
      • @chimchillas 不,它对启动时间没有影响。实际上变量“s”确实是一个字符串,只是你说的是“var”,所以你让编译器在编译时为你计算出来。运行速度完全一样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2015-04-05
      • 2011-12-12
      • 1970-01-01
      • 2011-02-12
      • 2014-10-04
      相关资源
      最近更新 更多