程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 獲取代碼所在的位置信息

獲取代碼所在的位置信息

編輯:C#入門知識

要實現獲取代碼所在的位置信息的功能, 類System.Diagnostics.StackFrame是關鍵,源碼如下:

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()); //獲取包含所執行代碼的文件名。 15               Console.WriteLine(stackFrame.GetFileLineNumber().ToString());   //也就是FirstLevel()被調用地方的行號 16               Console.WriteLine(stackFrame.GetFileColumnNumber().ToString());   //也就是FirstLevel()被調用地方的第一個字母“F”所處的列 17               Console.WriteLine(stackFrame.GetMethod().Module);   //stackFrame.GetMethod()獲取在其中執行幀的方法。 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 }

執行結果如下:

C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs
24
13
ConsoleApplication1.exe
ConsoleApplication1.Program
Void SecondLevel()

分析如下:

構造函數StackFrame(int skipFrames, bool fNeedFileInfo)中,skipFrames為堆棧上幀跳過當前幀的幀數,fNeedFileInfo表示是否想獲取堆棧幀所在文件名、行號、列號(Visual Studio 2010中,定位到構造函數StackFrame(1, true)調用處,按F12,即可看到此信息)。

那麼什麼是堆棧幀?“堆棧幀是在堆棧中為當前正在運行的函數分配的區域(或空間)。傳入的參數、返回地址(當這個函數結束後必須跳轉到該返回地址。譯注:即主調函數的斷點處)以及函數所用的內部存儲單元(即函數存儲在堆棧上的局部變量)都在堆棧幀中。”(http://book.51cto.com/art/200804/70915.htm)舉個例子,A()調用B(),B()調用C(),那麼,B()所處的堆棧幀剛好在C()所處堆棧幀的上一個,也就是說B()相對C()的幀跳數為1,A()的相對C()的幀跳數就為2。

好了,明白了這個,再來看將FirstLevel()中“StackFrame stackFrame = new StackFrame(1, true);”改為“StackFrame stackFrame = new StackFrame(2, true);”後的結果:

C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs
29
13
ConsoleApplication1.exe
ConsoleApplication1.Program
Void Main(System.String[])

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved