7

我正在做一个代码审查,发现我们的一个开发人员正在使用这样的空对象初始化程序创建一个对象:

List<Floorplan> floorplans = new List<Floorplan> { };

我不知道他为什么会以这种方式实例化,而不是:

List<Floorplan> floorplans = new List<Floorplan>();

使用空对象初始化器进行对象实例化有什么缺点吗?除了风格不一致之外,我想知道是否有理由避免这种方法。有些东西告诉我这闻起来很臭,但在我说什么之前我想确定一下。

4

5 回答 5

10

编译结果是一样的。

以下 C#:

static void Main()
{
    var x = new List<int>();
    var y = new List<int> { };
}

编译成以下 IL:

.method private hidebysig static 
    void Main () cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 14 (0xe)
    .maxstack 1
    .entrypoint
    .locals init (
        [0] class [mscorlib]System.Collections.Generic.List`1<int32> x,
        [1] class [mscorlib]System.Collections.Generic.List`1<int32> y
    )

    IL_0000: nop
    IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
    IL_0006: stloc.0
    IL_0007: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
    IL_000c: stloc.1
    IL_000d: ret
} // end of method Program::Main

如果向集合添加值:

static void Main()
{
    var x = new List<int>();
    x.Add(1);
    var y = new List<int> { 1 };
}

这是生成的 IL:

.method private hidebysig static 
    void Main () cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 32 (0x20)
    .maxstack 2
    .entrypoint
    .locals init (
        [0] class [mscorlib]System.Collections.Generic.List`1<int32> x,
        [1] class [mscorlib]System.Collections.Generic.List`1<int32> y,
        [2] class [mscorlib]System.Collections.Generic.List`1<int32> '<>g__initLocal0'
    )

    IL_0000: nop
    IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
    IL_0006: stloc.0
    IL_0007: ldloc.0
    IL_0008: ldc.i4.1
    IL_0009: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
    IL_000e: nop
    IL_000f: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
    IL_0014: stloc.2
    IL_0015: ldloc.2
    IL_0016: ldc.i4.1
    IL_0017: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
    IL_001c: nop
    IL_001d: ldloc.2
    IL_001e: stloc.1
    IL_001f: ret
} // end of method Program::Main

这显示了集合初始化器如何只是语法糖。因为集合初始值设定项最初不是 C# 的一部分,所以我认为人们更习惯于构造函数语法。如果我遇到一些使用空集合初始化程序的代码,我会想知道为什么,但它肯定没有任何严重的可读性问题。如果一个人足够聪明,可以完全理解代码,那么{}vs()不应该如此沮丧以至于破坏了一个人理解代码在做什么的能力。这归结为见仁见智。做你的团队同意的事情,如果只有你,那就用它来满足你的心。

于 2013-08-02T17:41:48.940 回答
3

在这种情况下,没有缺点,但有利于可读性。如果您在实例化时不需要额外的括号,请不要简单明了地使用它们。

我什至会说有利于生产力。这里的很多答案都在试图回答这个问题。即使一种技术比另一种更好,我们也在谈论什么是真正的微优化。

于 2013-08-02T17:15:35.107 回答
1

没有理由在{ }那里使用初始化,所以我会说删除它。开发人员正在使用静态集合初始化程序。您这样做的唯一原因是,您可以从一些项目开始收集,因为没有任何项目并没有真正意义。话虽如此,结果将是一个空集合,就像他正常调用构造函数一样。

于 2013-08-02T17:15:22.847 回答
1

它们基本相同,但使用默认构造函数更具可读性。

于 2013-08-02T17:15:41.480 回答
0

有很多评论说“默认构造函数更具可读性”。没有充分的理由假设它()比 更具(或更少)可读性{},因此您在这里有效地进行了民意调查。

如果您担心正确性,您同事的代码就可以了。如果您担心编码标准,则应确保更改代码以符合您的标准(无论该标准是什么)。

于 2013-08-02T17:31:51.420 回答