使用空对象初始值设定项有什么缺点吗
本文关键字:什么 缺点 对象 | 更新日期: 2023-09-27 18:26:12
我正在进行代码审查,发现一行代码中,我们的一名开发人员正在使用空对象初始化器创建一个对象,如下所示:
List<Floorplan> floorplans = new List<Floorplan> { };
我不知道为什么他会以这种方式实例化,而不是:
List<Floorplan> floorplans = new List<Floorplan>();
使用空对象初始化器进行对象实例化有什么缺点吗?除了风格不一致之外,我想知道是否有理由避免这种方法。有东西告诉我闻起来有味道,但我想在说话之前确定一下。
编译后的结果相同。
以下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#的一部分,所以我认为人们更习惯于构造函数语法。如果我遇到一些使用空集合初始值设定项的代码,我会想为什么,但它肯定没有任何严重的可读性问题。如果一个人足够聪明,能够理解代码,那么{}
和()
就不应该如此令人沮丧,以至于破坏了一个人理解代码的能力。这归根结底是一个意见问题。做你的团队同意的事情,如果只有你,那么就尽情地使用它。
在这种情况下没有缺点,但有利于可读性。如果在实例化时不需要额外的括号,那么就不要简单明了地使用它们。
我甚至会说有利于生产力。在试图回答这个问题的过程中,这里的许多答案都在不断深入。即使一种技术比另一种更好,我们也在谈论什么是真正的微观优化。
它们基本相同,但使用默认构造函数更具可读性。
没有理由在那里使用{ }
初始化,所以我会说删除它。开发人员正在使用静态集合初始化器。你这样做的唯一原因是,你可以从一些物品开始收集,如果没有,那就没有意义了。话虽如此,结果将是一个空集合,就像他正常调用构造函数一样。
有很多评论说"默认构造函数更可读"。没有充分的理由假设()
比{}
可读性更强(或更低),所以你实际上是在进行民意调查。
如果您担心正确性,那么您同事的代码是可以的。如果您担心编码标准,您应该确保更改代码以匹配您的标准(无论该标准是什么)。