翻开书第176页,看第3道题……还记得中学的时候,老师就是这么说的吗?
现在我要说:
用ILDasm.EXE(VS2003在E:\VS.NET 2003\SDK\v1.1\bin里面,VS2002在E:\VS.NET\FrameworkSDK\bin 里面)打开mscorlib.dll(在C:\WINNT\Microsoft.NET\Framework\v1.x.xxxx 里面),找到System,打开,在里面找DateTime,打开,在里面找DateToTicks,双击。好了,现在开始跟我一步步来:
CIL |
C# |
.method private hidebysig static int64 DateToTicks(int32 year, ?int32 month, ?int32 day) cil managed { // 代码大小 126 (0x7e) .maxstack 5 .locals (int32[] V_0, int32 V_1, int32 V_2) IL_0000: ldarg.0 IL_0001: ldc.i4.1 IL_0002: blt.s IL_006e IL_0004: ldarg.0 IL_0005: ldc.i4 0x270f IL_000a: bgt.s IL_006e IL_000c: ldarg.1 IL_000d: ldc.i4.1 IL_000e: blt.s IL_006e
IL_0010: ldarg.1
IL_0011: ldc.i4.s 12
IL_0013: bgt.s IL_006e
IL_0015: ldarg.0
IL_0016: call bool System.DateTime::IsLeapYear(int32) IL_001b: brtrue.s IL_0024 IL_001d: ldsfld int32[] System.DateTime::DaysToMonth365 IL_0022: br.s IL_0029 IL_0024: ldsfld int32[] System.DateTime::DaysToMonth366 IL_0029: stloc.0 IL_002a: ldarg.2 IL_002b: ldc.i4.1
IL_002c: blt.s IL_006e
IL_002e: ldarg.2 IL_002f: ldloc.0 IL_0030: ldarg.1
IL_0031: ldelem.i4
IL_0032: ldloc.0 IL_0033: ldarg.1 IL_0034: ldc.i4.1 IL_0035: sub IL_0036: ldelem.i4 IL_0037: sub
IL_0038: bgt.s IL_006e
IL_003a: ldarg.0 IL_003b: ldc.i4.1 IL_003c: sub IL_003d: stloc.1 IL_003e: ldloc.1 IL_003f: ldc.i4 0x16d IL_0044: mul
IL_0045: ldloc.1 IL_0046: ldc.i4.4 IL_0047: div IL_0048: add IL_0049: ldloc.1 IL_004a: ldc.i4.s 100 IL_004c: div
IL_004d: sub IL_004e: ldloc.1 IL_004f: ldc.i4 0x190 IL_0054: div IL_0055: add IL_0056: ldloc.0 IL_0057: ldarg.1 IL_0058: ldc.i4.1
IL_0059: sub IL_005a: ldelem.i4 IL_005b: add IL_005c: ldarg.2 IL_005d: add IL_005e: ldc.i4.1 IL_005f: sub IL_0060: stloc.2
IL_0061: ldloc.2 IL_0062: conv.i8 IL_0063: ldc.i8 0xc92a69c000 IL_006c: mul IL_006d: ret
IL_006e: ldstr "ArgumentOutOfRange_BadYearMonthDay" IL_0073: call string System.Environment::GetResourceString(string) IL_0078: newobj instance void System.ArgumentOutOfRangeException::.ctor(string) IL_007d: throw } // end of method DateTime::DateToTicks |
>year >year 1 >if (!(year < 1)) { } >if (year >= 1) {year} >if (year >= 1) {year 0x270f} >if (year >= 1 && (!(year > 0x270f))) { } >if (year >= 1 && year <= 0x270f) {month} >if (year >= 1 && year <= 9999) {month 1} >if (year >= 1 && year <= 9999 && (!(month<1))) { } >if (year >= 1 && year <= 9999 && month >= 1) {month} >if (year >= 1 && year <= 9999 && month >= 1) {month 12} >if (year >= 1 && year <= 9999 && month >= 1 && (!(month > 12))) { } >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) {year} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) {IsLeapYear(year)} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) ?{ ?? V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366; ?}
>if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) ?{ ?? V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366; ?? day 1 ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && (!(day < 1))) ?{ ?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366; ? } >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1) ?{ ?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366; ?? day V_0 month ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1) ?{ ?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366; ?? day V_0[month] ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1) ?{ ?? // V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366; ?? day V_0[month] - V_0[month - 1] ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && (!(day > (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1]))) ?{ ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1]) ?{ ?? V_1 = year - 1; ?? V_1 * 0x16d ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1]) ?{ ?? V_1 = year - 1; ?? V_1 * 365 + V_1 / 4 V_1 / 100 ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1]) ?{ ?? V_1 = year - 1; ?? V_1 * 365 + V_1 / 4 - V_1 / 100 + V_1 / 0x190 V_0 month 1 ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1]) ?{ ?? V_1 = year - 1; ?? V_2 = V_1 * 365 + V_1 / 4 - V_1 / 100 + V_1 / 400 + V_0[month - 1] + day - 1; ?} >if (year >= 1 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= (V_0 = IsLeapYear(year)DaysToMonth365:DaysToMonth366)[month] - V_0[month - 1]) ?{ ?? V_1 = year - 1; ?? V_2 = V_1 * 365 + V_1 / 4 - V_1 / 100 + V_1 / 400 + V_0[month - 1] + day - 1; ?? return ((long) V_2) * 0xc92a69c000; // 864000000000 = 24 * 60 * 60 * 10000000 ?} else ?{ ?? throw new ArgumentOutOfRangeException(Environment.GetResourceString("ArgumentOutOfRange_BadYearMonthDay")); ?}
|
注意:这里C#一列中,某一个“>”(a)到下一个“>”(b)之间的C#代码,表示到(b)所对应的左边的IL为止,翻译出来的C#代码。
呵呵,希望不是很难阅读。

文章来源:
http://dotnet.blogger.cn/sumtec/articles/211.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器