1

このような値を割り当てると、パフォーマンスが低下しますか?

Dropdown1.Enable = dropdown2.Enable = dropdown3.Enable = false;

前もって感謝します。

4

3 に答える 3

4

答えは、影響がないということです。これは、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のソース値であることに注意してください。

于 2012-10-11T11:22:23.413 に答える
1

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.03回ヒットするか、1回ヒットしてスタックに2回複製することです。パフォーマンスは重要ではありません。ただし、そのfalse値を取得することが重要な操作である場合は、3行に配置するのに時間がかかりますが、次のように簡単に記述できます。

bool value = SomeLongOperation();
t1.Prop = value;
t2.Prop = value;
t3.Prop = value;

ですから、読みやすさや社内の基準に最適なことは何でもしてください。

編集:実際、コンパイラ/ JITが個別の行エントリを本質的に最初のケース(またはどちらか速い方)または他の最適化された状態に最適化しても驚かないでしょう。実際、気になるのは最後のコードサンプルだけです。SomeLongOperation()値を取得するために行う必要がある場合は、1回だけ実行してください。その後、読みやすいことは何でもします。

于 2012-10-11T11:19:27.173 に答える
0

あなたは通常このようにそれをします:

variable1 = varaible2 = variable3 = 123

ただし、Enable宿泊施設はゲッターであるため、できません。内部的には、ゲッターは次のようになります。

public bool Enabled
{
    get
    {
        return something;
    }
    set
    {
        something = value;
    }
}
于 2012-10-11T11:06:16.273 に答える