我正在用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
}
// ....
}
答案 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