- PR -

VB.NETのWith...End WithをC#で実現するには

1
投稿者投稿内容
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-05-07 05:51
VB.NETのWith...End WithをC#で実現するには

VB.NETで次のようなコードを記述すると
コード:
Ret = ds.Tables("Customers").Rows.Count
If ds.Tables("Customers").Rows.IsReadOnly Then
End if
ds.Tables("Customers").Rows.Clear


IL には、get_Tables()のように同じメソッドが3回も呼び出されるようなコード
が生成されます。(つまり、最適化されません)
コード:
ldloc.0
callvirt   instance class [System.Data]System.Data.DataTableCollection 
             [System.Data]System.Data.DataSet::get_Tables()
ldstr      "Customers"
callvirt   instance class [System.Data]System.Data.DataTable 
             [System.Data]System.Data.DataTableCollection::get_Item(string)
callvirt   instance class [System.Data]System.Data.DataRowCollection 
             [System.Data]System.Data.DataTable::get_Rows()
callvirt   instance int32 [System.Data]System.Data.InternalDataCollectionBase::get_Count()
stloc.1

ldloc.0
callvirt   instance class [System.Data]System.Data.DataTableCollection 
             [System.Data]System.Data.DataSet::get_Tables()
ldstr      "Customers"
callvirt   instance class [System.Data]System.Data.DataTable 
             [System.Data]System.Data.DataTableCollection::get_Item(string)
callvirt   instance class [System.Data]System.Data.DataRowCollection 
             [System.Data]System.Data.DataTable::get_Rows()
callvirt   instance bool [System.Data]System.Data.InternalDataCollectionBase::get_IsReadOnly()
brfalse.s  IL_0066

ldloc.0
callvirt   instance class [System.Data]System.Data.DataTableCollection 
             [System.Data]System.Data.DataSet::get_Tables()
ldstr      "Customers"
callvirt   instance class [System.Data]System.Data.DataTable 
             [System.Data]System.Data.DataTableCollection::get_Item(string)
callvirt   instance class [System.Data]System.Data.DataRowCollection 
             [System.Data]System.Data.DataTable::get_Rows()
callvirt   instance void [System.Data]System.Data.DataRowCollection::Clear()


このオーバーヘッドを回避するには、VB.NET の With...End With ステートメント
を使用すると解決します。Withステートメントを使用するとオブジェクトがローカル
変数に退避されて再使用されます。End Withステートメントでは、ローカル変数を
解放します。
コード:
With ds.Tables("Customers").Rows
  Ret = .Count
  If .IsReadOnly Then
  End if
  .Clear
End With



VB.NETのWith...End Withを C# で実現するには、
コード:
DataRowCollection drc = ds.Tables["Customers"].Rows;
 ret = drc.Count;
 if(drc.IsReadOnly) {}
 drc.Clear();
drc = null;


のように、ds.Tables["Customers"].Rows オブジェクトをローカル変数 drc に
退避してローカル変数を使用してプロパティ/メソッド参照します。

Happy Programming
Akio Kasai

1

スキルアップ/キャリアアップ(JOB@IT)