ListItem-HtmlControl

DASM一下 ListItem :

.method assembly hidebysig instance object 
        SaveViewState() cil managed
{
  // Code size       89 (0x59)
.maxstack  4 //定义函数代码所用堆栈的最大深度,也指valuation Stack中最多只能同时存在4个值
.locals init (string V_0, string V_1) //定义string类型参数,V_0,V_1(此时已经把V_0,V_1存入了Call Stack的Record Frame中)
IL_0000: ldnull //将空引用推送到计算堆栈上。
IL_0001:stloc.0 // 从栈中把i的值淡出并赋值给Record Frame中第0个位置(V_0) 
IL_0002:ldnull //将空引用推送到计算堆栈上。

IL_0003: stloc.1 // 从栈中把"j"的值弹出并赋值给Record Frame中第1个位置(V_1)
IL_0004: ldarg.0 // 加载当前方法传入的第一个参数; ldarg.1即为加载第二个参数
IL_0005: ldfld
bool System.Web.UI.WebControls.ListItem::textisdirty // 加载一个对象实例的成员到栈中

IL_000a: brfalse.s IL_0013
IL_000c: ldarg.
0 //加载方法的参数到栈中。除了泛型ldarg(需要一个索引作为参数)
IL_000d: call instance
string System.Web.UI.WebControls.ListItem::get_Text() //调用一个成员
IL_0012: stloc.
0 //弹出当前栈顶的值并存储在一个本地变量列表中,根据所以确定这个参数
IL_0013: ldarg.
0 // 加载当前方法传入的第一个参数; ldarg.1即为加载第二个参数
IL_0014: ldfld
bool System.Web.UI.WebControls.ListItem::valueisdirty //加载一个对象实例的成员到栈中
IL_0019: brfalse.s
IL_0022 IL_001b: ldarg.
0
IL_001c: call instance
string System.Web.UI.WebControls.ListItem::get_Value()
IL_0021: stloc.
1
IL_0022: ldarg.
0
IL_0023: ldfld
bool System.Web.UI.WebControls.ListItem::enabledisdirty
IL_0028: brfalse.s IL_003d
IL_002a: ldloc.
0 //加载一个本地变量到栈中
IL_002b: ldloc.
1
IL_002c: ldarg.
0
IL_002d: call instance
bool System.Web.UI.WebControls.ListItem::get_Enabled()
IL_0032: box [mscorlib]System.Boolean //在引用类型和值类型之间转换
IL_0037: newobj instance
void System.Web.UI.Triplet::.ctor(object, object, object)
IL_003c: ret
IL_003d: ldarg.
0
IL_003e: ldfld
bool System.Web.UI.WebControls.ListItem::valueisdirty IL_0043: brfalse.s
IL_004d IL_0045: ldloc.
0
IL_0046: ldloc.
1
IL_0047: newobj instance
void System.Web.UI.Pair::.ctor(object, object) // 在内存中创建一个新的数组或新的对象类型
IL_004c: ret
IL_004d: ldarg.
0
IL_004e: ldfld
bool System.Web.UI.WebControls.ListItem::textisdirty IL_0053: brfalse.s
IL_0057 IL_0055: ldloc.
0
IL_0056: ret //退出方法和返回一个值
IL_0057: ldnull
IL_0058: ret }
// end of method ListItem::SaveViewState

SaveViewState确实没有保存Attributes,只是持久化了Text Value Enabled(这个还是按需)三个属性,
其实,ListItem.Attributes 内部都只是简单的如此实现,并没有像常见的有单独一个私有StateBag _attrState 与 AttributeCollection _attrCol出现,只是如果 _atrrCol如果为null,直接传了局部的StateBag 给

AttributeCollection构造函数:

.method public hidebysig specialname instance class System.Web.UI.AttributeCollection 
        get_Attributes() cil managed
{
  // Code size       32 (0x20)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldfld      class System.Web.UI.AttributeCollection System.Web.UI.WebControls.ListItem::_attributes
  IL_0006:  brtrue.s   IL_0019
  IL_0008:  ldarg.0
  IL_0009:  ldc.i4.1
  IL_000a:  newobj     instance void System.Web.UI.StateBag::.ctor(bool)
  IL_000f:  newobj     instance void System.Web.UI.AttributeCollection::.ctor(class System.Web.UI.StateBag)
  IL_0014:  stfld      class System.Web.UI.AttributeCollection System.Web.UI.WebControls.ListItem::_attributes
  IL_0019:  ldarg.0
  IL_001a:  ldfld      class System.Web.UI.AttributeCollection System.Web.UI.WebControls.ListItem::_attributes
  IL_001f:  ret
} // end of method ListItem::get_Attributes

值得注意的是,这里  Scott Mitchell  采取的策略是分别扩展 DropDownList、CheckBoxlist等,而不是直接扩展 ListItem,减轻了工作量,详细见文章。

IL_0001
posted @ 2021-11-13 23:36  vba是最好的语言  阅读(55)  评论(0编辑  收藏  举报