このような値を割り当てると、パフォーマンスが低下しますか?
Dropdown1.Enable = dropdown2.Enable = dropdown3.Enable = false;
前もって感謝します。
このような値を割り当てると、パフォーマンスが低下しますか?
Dropdown1.Enable = dropdown2.Enable = dropdown3.Enable = false;
前もって感謝します。
答えは、影響がないということです。これは、3つの割り当てステートメントに相当します。
get
以下に示すように、呼び出される操作すらありません。
コンソールアプリケーションプロジェクト:
using System;
using System.Diagnostics;
namespace ConsoleApplication5
{
public class X
{
private int _a;
private int _b;
public int A
{
get
{
Console.WriteLine("get A");
return _a + 1;
}
set
{
Console.WriteLine("set A");
_a = value;
}
}
public int B
{
get
{
Console.WriteLine("get B");
return _b + 2;
}
set
{
Console.WriteLine("set B");
_b = value;
}
}
}
class Program
{
static void Main(string[] args)
{
var x = new X();
Console.WriteLine("Assign");
int y = x.B = x.A = 125;
Console.WriteLine("Read");
Console.WriteLine("y " + y + " x.B " + x.B + " x.A " + x.A);
Console.ReadLine();
}
}
}
生成:
Assign
set A
set B
Read
get B
get A
y 125 x.B 127 x.A 126
割り当てフェーズでは、'get'erは呼び出されず、AとBのゲッターは、それらに設定された値とは異なる値を返しますが、最終的に割り当てられるy
値は、式のRHSのソース値であることに注意してください。
getters
他の2つの答えから何かを誤解しているかもしれませんが、解雇されているとは思いません。3つのケースすべてで、プロパティに対して起動されるのはセッターです。false
さらに、ILは値をスタックに3回プッシュし、それぞれに1回セッターを起動するだけだと確信しています。
次のクラスの場合:
public class Test
{
public bool Prop { get; set; }
}
t1.Prop = t2.Prop = t3.Prop = false;
ILの場合:
IL_0013: ldloc.0 //t1
IL_0014: ldloc.1 //t2
IL_0015: ldloc.2 //t2
IL_0016: ldc.i4.0 //false
IL_0017: dup //dup the false on the stack
IL_0018: stloc.3
IL_0019: callvirt UserQuery+Test.set_Prop //set value
IL_001E: nop
IL_001F: ldloc.3
IL_0020: dup //dup the false on the stack
IL_0021: stloc.3
IL_0022: callvirt UserQuery+Test.set_Prop //set value
IL_0027: nop
IL_0028: ldloc.3
IL_0029: callvirt UserQuery+Test.set_Prop //set value
にとって:
t1.Prop = false;
t2.Prop = false;
t3.Prop = false;
ILは次のとおりです。
IL_0012: stloc.2
IL_0013: ldloc.0
IL_0014: ldc.i4.0 //false
IL_0015: callvirt UserQuery+Test.set_Prop //set value
IL_001A: nop
IL_001B: ldloc.1
IL_001C: ldc.i4.0 //false
IL_001D: callvirt UserQuery+Test.set_Prop //set value
IL_0022: nop
IL_0023: ldloc.2
IL_0024: ldc.i4.0 //false
IL_0025: callvirt UserQuery+Test.set_Prop //set value
したがって、ILはかなり近く、実際の唯一の違いは、ldc.i4.0
3回ヒットするか、1回ヒットしてスタックに2回複製することです。パフォーマンスは重要ではありません。ただし、そのfalse
値を取得することが重要な操作である場合は、3行に配置するのに時間がかかりますが、次のように簡単に記述できます。
bool value = SomeLongOperation();
t1.Prop = value;
t2.Prop = value;
t3.Prop = value;
ですから、読みやすさや社内の基準に最適なことは何でもしてください。
編集:実際、コンパイラ/ JITが個別の行エントリを本質的に最初のケース(またはどちらか速い方)または他の最適化された状態に最適化しても驚かないでしょう。実際、気になるのは最後のコードサンプルだけです。SomeLongOperation()
値を取得するために行う必要がある場合は、1回だけ実行してください。その後、読みやすいことは何でもします。
あなたは通常このようにそれをします:
variable1 = varaible2 = variable3 = 123
ただし、Enable
宿泊施設はゲッターであるため、できません。内部的には、ゲッターは次のようになります。
public bool Enabled
{
get
{
return something;
}
set
{
something = value;
}
}