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