C# 实例化工作者变量最有效的方法是什么
我应该在for循环内部还是外部实例化worker变量 例如 (a)C# 实例化工作者变量最有效的方法是什么,c#,variables,for-loop,C#,Variables,For Loop,我应该在for循环内部还是外部实例化worker变量 例如 (a) bool b=默认值(bool); for(int i=0;i
bool b=默认值(bool);
for(int i=0;i
(b)
for(int i=0;i
编辑:似乎大家都同意在IL方面不会有什么不同。但为了可读性和范围的清晰性。。。内部更好我喜欢在循环中声明它们,这样可以节省一行代码(在同一行上声明和设置),并且更容易看到我在循环范围内外使用的变量,这在处理复杂的事情时很好。内部看起来更干净,但同意Jon的观点,IL将是相同的。先前的答案被删除,因为我误读了代码。(顺便说一句,在任何地方使用“default(bool)”都有点奇怪。) 然而,除非变量被委托等捕获,否则我希望它们要么编译成实际上相同的IL(在行为和性能方面) 一如既往,首先编写可读性最高的代码。像这样的微观优化是自找麻烦。我同意其他人的意见,他们建议你尽可能地限制变量的范围——因此,如果你在循环之后需要它,你没有任何选择;否则在里面申报 好的,这里有一个测试程序:
using System;
class Test
{
static void Main() {}
static void DeclareInside()
{
for (int i=0; i < 10; i++)
{
bool x = false;
for (int j=5; j < 20; j++)
{
if (i == j)
{
x = true;
break;
}
if (x)
{
Console.WriteLine("Yes");
}
}
}
}
static void DeclareOutside()
{
bool x;
for (int i=0; i < 10; i++)
{
x = false;
for (int j=5; j < 20; j++)
{
if (i == j)
{
x = true;
break;
}
if (x)
{
Console.WriteLine("Yes");
}
}
}
}
}
唯一的区别是变量在堆栈中的位置。内部。变量的范围应与其实际使用情况相符。将其声明在包含块的变量范围之外,这是不必要的,可能会导致混淆 编辑:我猜这段代码只是为了说明示例,但实际上我省略了无关变量,并将其写成:
for (int i = 0; i < MyCollection.Length; i++)
{
foreach(MyObjectClass myObject in myObjectCollection)
{
if (myObject.Property == MyCollection[i].Property)
{
DoSomethingWith(MyCollection[i]);
break;
}
}
}
for(int i=0;i
将变量声明为尽可能靠近第一个使用它们的位置,让编译器担心生成最有效的IL(至少在本例中是这样)。另一点是范围。如果一个变量是在循环外声明的,我应该期望它在循环后使用吗?这是我通常的假设。首先考虑的是如何使用阅读器编写代码。一小部分代码应该被优化
在优化和可读性之间常常存在权衡。由于大部分人力都花在修改和编辑现有代码上,因此倾向于可读性而不是优化通常是正确的决定
这里经常使用80/20规则。我同意siz,我取决于作用域,如果变量不在循环内以外的任何地方使用,则在循环内声明它。如果要在循环完成后使用,则需要在外部声明。我以前在外部执行,但ReSharper告诉我在内部执行。我对人们的回答很感兴趣,“bool b=default(bool)”非常古怪!使用=default(bool)只是因为我知道它和说=false是一样的(尽管现在我怀疑自己!)是的,它和说“=false”是一样的-但乍一看,这是我看到的两个代码示例之间最大的区别。在循环内部,一个使用“=false”,另一个使用“=default(bool)”。
using System;
class Test
{
static void Main() {}
static void DeclareInside()
{
for (int i=0; i < 10; i++)
{
bool x = false;
for (int j=5; j < 20; j++)
{
if (i == j)
{
x = true;
break;
}
if (x)
{
Console.WriteLine("Yes");
}
}
}
}
static void DeclareOutside()
{
bool x;
for (int i=0; i < 10; i++)
{
x = false;
for (int j=5; j < 20; j++)
{
if (i == j)
{
x = true;
break;
}
if (x)
{
Console.WriteLine("Yes");
}
}
}
}
}
.method private hidebysig static void DeclareOutside() cil managed
{
// Code size 79 (0x4f)
.maxstack 2
.locals init (bool V_0,
int32 V_1,
int32 V_2,
bool V_3)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.1
IL_0003: br.s IL_0045
IL_0005: nop
IL_0006: ldc.i4.0
IL_0007: stloc.0
IL_0008: ldc.i4.5
IL_0009: stloc.2
IL_000a: br.s IL_0037
IL_000c: nop
IL_000d: ldloc.1
IL_000e: ldloc.2
IL_000f: ceq
IL_0011: ldc.i4.0
IL_0012: ceq
IL_0014: stloc.3
IL_0015: ldloc.3
IL_0016: brtrue.s IL_001d
IL_0018: nop
IL_0019: ldc.i4.1
IL_001a: stloc.0
IL_001b: br.s IL_0040
IL_001d: ldloc.0
IL_001e: ldc.i4.0
IL_001f: ceq
IL_0021: stloc.3
IL_0022: ldloc.3
IL_0023: brtrue.s IL_0032
IL_0025: nop
IL_0026: ldstr "Yes"
IL_002b: call void [mscorlib]System.Console::WriteLine(string)
IL_0030: nop
IL_0031: nop
IL_0032: nop
IL_0033: ldloc.2
IL_0034: ldc.i4.1
IL_0035: add
IL_0036: stloc.2
IL_0037: ldloc.2
IL_0038: ldc.i4.s 20
IL_003a: clt
IL_003c: stloc.3
IL_003d: ldloc.3
IL_003e: brtrue.s IL_000c
IL_0040: nop
IL_0041: ldloc.1
IL_0042: ldc.i4.1
IL_0043: add
IL_0044: stloc.1
IL_0045: ldloc.1
IL_0046: ldc.i4.s 10
IL_0048: clt
IL_004a: stloc.3
IL_004b: ldloc.3
IL_004c: brtrue.s IL_0005
IL_004e: ret
} // end of method Test::DeclareOutside
.method private hidebysig static void DeclareInside() cil managed
{
// Code size 79 (0x4f)
.maxstack 2
.locals init (int32 V_0,
bool V_1,
int32 V_2,
bool V_3)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: br.s IL_0045
IL_0005: nop
IL_0006: ldc.i4.0
IL_0007: stloc.1
IL_0008: ldc.i4.5
IL_0009: stloc.2
IL_000a: br.s IL_0037
IL_000c: nop
IL_000d: ldloc.0
IL_000e: ldloc.2
IL_000f: ceq
IL_0011: ldc.i4.0
IL_0012: ceq
IL_0014: stloc.3
IL_0015: ldloc.3
IL_0016: brtrue.s IL_001d
IL_0018: nop
IL_0019: ldc.i4.1
IL_001a: stloc.1
IL_001b: br.s IL_0040
IL_001d: ldloc.1
IL_001e: ldc.i4.0
IL_001f: ceq
IL_0021: stloc.3
IL_0022: ldloc.3
IL_0023: brtrue.s IL_0032
IL_0025: nop
IL_0026: ldstr "Yes"
IL_002b: call void [mscorlib]System.Console::WriteLine(string)
IL_0030: nop
IL_0031: nop
IL_0032: nop
IL_0033: ldloc.2
IL_0034: ldc.i4.1
IL_0035: add
IL_0036: stloc.2
IL_0037: ldloc.2
IL_0038: ldc.i4.s 20
IL_003a: clt
IL_003c: stloc.3
IL_003d: ldloc.3
IL_003e: brtrue.s IL_000c
IL_0040: nop
IL_0041: ldloc.0
IL_0042: ldc.i4.1
IL_0043: add
IL_0044: stloc.0
IL_0045: ldloc.0
IL_0046: ldc.i4.s 10
IL_0048: clt
IL_004a: stloc.3
IL_004b: ldloc.3
IL_004c: brtrue.s IL_0005
IL_004e: ret
} // end of method Test::DeclareInside
for (int i = 0; i < MyCollection.Length; i++)
{
foreach(MyObjectClass myObject in myObjectCollection)
{
if (myObject.Property == MyCollection[i].Property)
{
DoSomethingWith(MyCollection[i]);
break;
}
}
}