如何正确实例化类,变量和对象以获得最佳性能?

时间:2018-01-24 09:55:39

标签: c# .net compiler-optimization

我正在用C#创建一个GUI,我正在尝试提高启动/加载性能,因为我必须在其他类中加载很多东西。

我已经阅读了有关晚期和早期绑定的内容,但我认为这两种方式都是.NET中的早期绑定。

我有一个基本问题,我试图找出实例化类/变量的最佳方法:直接在开头还是在构造函数中?或者它是否适用于编译器?

我有两个选项,哪个更好(更快)?

选项1:

public partial class MainClass : Window
{

    private SomeClass someClass1;
    private OneMoreClass someClass2;
    //....
    private String someString;
    private int someInt;


    public MainClass()
    {
        this.someClass1 = new SomeClass();
        this.someClass2 = new OneMoreClass();
        this.someString = "test 12345";
        this.someInt = 42;
    }

    // ....
}

选项2:

public partial class MainClass : Window
{

    private SomeClass someClass1 = new SomeClass();
    private OneMoreClass someClass2 = new OneMoreClass();
    //....
    private String someString = "test 12345";
    private int someInt = 42;


    public MainClass()
    {
        // nothing to construct
    }

    // ....
}

1 个答案:

答案 0 :(得分:0)

你可以试试自己;-) 但是在网站sharplab.io上,你可以看到c#代码的IL代码。

对于程序:

using System;
public class C {
    private A A = new A();
    public C()
    {
    }

    public void M() {

    }
}

public class A
{
}

IL代码是:

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit C
    extends [mscorlib]System.Object
{
    // Fields
    .field private class A A

    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 18 (0x12)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: newobj instance void A::.ctor()
        IL_0006: stfld class A C::A
        IL_000b: ldarg.0
        IL_000c: call instance void [mscorlib]System.Object::.ctor()
        IL_0011: ret
    } // end of method C::.ctor

    .method public hidebysig 
        instance void M () cil managed 
    {
        // Method begins at RVA 0x2063
        // Code size 1 (0x1)
        .maxstack 8

        IL_0000: ret
    } // end of method C::M

} // end of class C

.class public auto ansi beforefieldinit A
    extends [mscorlib]System.Object
{
    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2065
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    } // end of method A::.ctor

} // end of class A

并且:

using System;
public class C {
    private A A;
    public C()
    {
        A = new A();
    }

    public void M() {

    }
}

public class A
{
}

IL代码是:

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit C
    extends [mscorlib]System.Object
{
    // Fields
    .field private class A A

    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 18 (0x12)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ldarg.0
        IL_0007: newobj instance void A::.ctor()
        IL_000c: stfld class A C::A
        IL_0011: ret
    } // end of method C::.ctor

    .method public hidebysig 
        instance void M () cil managed 
    {
        // Method begins at RVA 0x2063
        // Code size 1 (0x1)
        .maxstack 8

        IL_0000: ret
    } // end of method C::M

} // end of class C

.class public auto ansi beforefieldinit A
    extends [mscorlib]System.Object
{
    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2065
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    } // end of method A::.ctor

} // end of class A

不同之处在于构造函数,一些方法,但顺序不同。所以应该快一样。

 instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 18 (0x12)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ldarg.0
        IL_0007: newobj instance void A::.ctor()
        IL_000c: stfld class A C::A
        IL_0011: ret
    } // end of method C::.ctor

instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 18 (0x12)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: newobj instance void A::.ctor()
        IL_0006: stfld class A C::A
        IL_000b: ldarg.0
        IL_000c: call instance void [mscorlib]System.Object::.ctor()
        IL_0011: ret
    } // end of method C::.ctor
相关问题