要實(shí)現(xiàn)獲取代碼所在的位置信息的功能,類System.Diagnostics.StackFrame是關(guān)鍵,源碼如下:
| 1 | using System; |
| 2 | using System.Collections.Generic; |
| 3 | using System.Linq; |
| 4 | using System.Text; |
| 5 | using System.Diagnostics; //需要知道源碼位置 |
| 6 | |
| 7 | namespace Consoleapplication1 |
| 8 | { |
| 9 | class PRogram |
| 10 | { |
| 11 | static void FirstLevel() |
| 12 | { |
| 13 | StackFrame stackFrame = new StackFrame(1, true); |
| 14 | Console.WriteLine(stackFrame.GetFileName()); //獲取包含所執(zhí)行代碼的文件名。 |
| 15 | Console.WriteLine(stackFrame.GetFileLineNumber().ToString()); //也就是FirstLevel()被調(diào)用地方的行號(hào) |
| 16 | Console.WriteLine(stackFrame.GetFileColumnNumber().ToString()); //也就是FirstLevel()被調(diào)用地方的第一個(gè)字母“F”所處的列 |
| 17 | Console.WriteLine(stackFrame.GetMethod().Module); //stackFrame.GetMethod()獲取在其中執(zhí)行幀的方法。 |
| 18 | Console.WriteLine(stackFrame.GetMethod().ReflectedType); |
| 19 | Console.WriteLine(stackFrame.GetMethod().ToString()); |
| 20 | } |
| 21 | |
| 22 | static void SecondLevel() |
| 23 | { |
| 24 | FirstLevel(); |
| 25 | } |
| 26 | |
| 27 | static void Main(string[] args) |
| 28 | { |
| 29 | SecondLevel(); |
| 30 | Console.ReadKey(); |
| 31 | } |
| 32 | } |
| 33 | } |
執(zhí)行結(jié)果如下:
C:/Users/Administrator/Desktop/ConsoleApplication1/ConsoleApplication1/Program.cs2413ConsoleApplication1.exeConsoleApplication1.ProgramVoid SecondLevel()
分析如下:
構(gòu)造函數(shù)StackFrame(int skipFrames, bool fNeedFileInfo)中,skipFrames為堆棧上幀跳過當(dāng)前幀的幀數(shù),fNeedFileInfo表示是否想獲取堆棧幀所在文件名、行號(hào)、列號(hào)(Visual Studio 2010中,定位到構(gòu)造函數(shù)StackFrame(1, true)調(diào)用處,按F12,即可看到此信息)。
那么什么是堆棧幀?“堆棧幀是在堆棧中為當(dāng)前正在運(yùn)行的函數(shù)分配的區(qū)域(或空間)。傳入的參數(shù)、返回地址(當(dāng)這個(gè)函數(shù)結(jié)束后必須跳轉(zhuǎn)到該返回地址。譯注:即主調(diào)函數(shù)的斷點(diǎn)處)以及函數(shù)所用的內(nèi)部存儲(chǔ)單元(即函數(shù)存儲(chǔ)在堆棧上的局部變量)都在堆棧幀中。”(http://book.51cto.com/art/200804/70915.htm)舉個(gè)例子,A()調(diào)用B(),B()調(diào)用C(),那么,B()所處的堆棧幀剛好在C()所處堆棧幀的上一個(gè),也就是說B()相對(duì)C()的幀跳數(shù)為1,A()的相對(duì)C()的幀跳數(shù)就為2。
好了,明白了這個(gè),再來看將FirstLevel()中“StackFrame stackFrame = new StackFrame(1, true);”改為“StackFrame stackFrame = new StackFrame(2, true);”后的結(jié)果:
C:/Users/Administrator/Desktop/ConsoleApplication1/ConsoleApplication1/Program.cs2913ConsoleApplication1.exeConsoleApplication1.ProgramVoid Main(System.String[])
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注