Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 快速实例化值类型和引用类型的成本_C#_Performance_Types_Declaration_Instantiation - Fatal编程技术网

C# 快速实例化值类型和引用类型的成本

C# 快速实例化值类型和引用类型的成本,c#,performance,types,declaration,instantiation,C#,Performance,Types,Declaration,Instantiation,编辑:去掉选项3,我现在看到它不相关了 主要问题: 我试图理解上面哪一项更可取,也许更具体地说,声明和实例化变量的位置如何影响性能 如果这些是引用类型而不是原始值类型(将“int\u a”切换为“Person\u a=new Person()”),该怎么办。这些场景在性能方面会有什么不同?如果愿意,会选择哪一种 其他问题: 对于基元值类型,是否存在构造函数 实例化原语和常规值类型(例如结构)之间在性能上有什么区别吗 事实: int是一种基本值类型 “int a=new int();”与“int

编辑:去掉选项3,我现在看到它不相关了

主要问题:

  • 我试图理解上面哪一项更可取,也许更具体地说,声明和实例化变量的位置如何影响性能
  • 如果这些是引用类型而不是原始值类型(将“int\u a”切换为“Person\u a=new Person()”),该怎么办。这些场景在性能方面会有什么不同?如果愿意,会选择哪一种
  • 其他问题:

  • 对于基元值类型,是否存在构造函数
  • 实例化原语和常规值类型(例如结构)之间在性能上有什么区别吗
  • 事实:

    • int是一种基本值类型
    • “int a=new int();”与“int a=0;”相同
    • 您可以在不使用new指令的情况下实例化一个值类型,但这意味着将调用一个默认的无参数构造函数,因此对于结构,您必须在结构中拥有该构造函数。此外,还必须手动设置结构中的每个字段
    • 在C#中,“new”并不意味着“在堆上创建对象”——它只意味着“调用构造函数”。对于值类型,它不会创建新对象,只是初始化一个新值。(参考:Jon Skeet)

    编辑2:我发现这一点很有意义,如果其他人遇到这个问题:

    C#在函数进入函数时为函数中的所有变量创建一个内存位置。如果执行循环,它不会重新初始化内存位置,因此1和2完全相同。对于3,如果您需要在每次通过该循环时设置它,那么这就是您需要的。否则,在适当的时候设置它。并根据它们的作用域应该是什么而不是你认为有助于性能的东西来确定作用域。

    老实说,如果变量是常量,编译器/优化器可以自由地“提升”变量,因此,即使你以文本方式更改了代码,生成的IL可能是相同的。这三种情况中的每一种都有不同的功能,那你怎么比较呢?在你的三个事实中(第四个被切断),只有第一个是正确的。”“int a=100;与“int a=new int()”相同;a=100;“”这是错误的,
    inta=newint();a=100
    inta=0相同;a=100。“您可以在不使用新指令的情况下实例化一个值类型,但这意味着它的构造函数不会被调用”再次错误,您没有看到一个构造函数被调用。抱歉,伙计们,修复了错误@ScottChamberlain,我认为对于实例结构,如果您不使用new,您必须手动设置每个字段,因为您没有将值传递给构造函数。@Magnus它仍然隐式调用无参数构造函数。如果试图在没有无参数构造函数的情况下生成结构,则会出现编译器错误。如果它是引用类型,并且我一直在非常快地反复执行“_person=New person();”,那么内存位置是否仍然相同?@Magnus在外循环的每次迭代中,两个代码段都在构造对象的新实例,不管变量的范围如何。您的第一个代码段不是创建一次对象,然后在外部循环的每次迭代中重新使用它。这使得它们在语义上完全相同。
    
    //Option 1:
    int _a;
    while (_running)
    {
        _a = _number;
        while (_doingWork)
        {
            //work involving a
        }
    }
    
    //Option 2:
    while (_running)
    {
        int _a = _number;
        while (_doingWork)
        {
            //work involving a
        }
    }