メンバーに対して単純な1プロパティを使用する場合、より多くのオーバーヘッド(つまり、メモリ、CPU、追加のILなど)がありますか?
1 「ゲッター」と「セッター」のアクセシビリティは同じです。値をメモリに格納する以外に、ゲッターとセッターで追加のロジックは発生しません。
Private CustomerId as Integer
Public CustomerName as String
対。
Private Property CustomerId as Integer
Public Property CustomerName as String
次のコードに対してILDasmツールを実行します。
public class Access
{
public int NumberField;
public int NumberProp { get; set; }
}
その結果、フィールドに対して次のILが生成されます
.field public int32 NumberField
そして、プロパティについては以下
.field private int32 '<NumberProp>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.method public hidebysig specialname instance int32
get_NumberProp() cil managed
{
// Omitting the entire IL code
} // end of method Access::get_NumberProp
.method public hidebysig specialname instance void
set_NumberProp(int32 'value') cil managed
{
// Omitting entire IL code
} // end of method Access::set_NumberProp
つまり、定義した「単純な」プロパティの概念全体は、コンパイラがその方法を理解すると実際には存在しません。k_BackingField値を挿入し、そのバッキングフィールドにアクセス/設定するゲッター/セッターを作成します。 。単純な場合でも、メソッドのみの属性をget / set関数にアタッチできることに注意してください。
このようにあなたの質問に答えるために、はい、そのget / setはまだメソッド呼び出しをもたらすので、より多くのオーバーヘッドがあります。編集:contactmattによって指摘されているように、これらの呼び出しはJITコンパイラーによってインライン化される場合があります。これにより、すでに最小化されているオーバーヘッドがゼロになります。
コンパイラの魔法と砂糖の同様の外観については、LambdaキャプチャがILの後でどのように見えるかも確認してください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加