马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。大概在某些场所下我们想晓得本人的某个办法是被谁(哪一个办法)挪用的?好比上面的例子:
<br>
<br>/**////<summary>
<br>///一般办法
<br>///</summary>
<br>staticvoidMethod1()
<br>{
<br>DisabledObsoleteMethod();
<br>}
<br>
/**////<summary>
<br>///过时办法
<br>///</summary>
<br>[Obsolete]
<br>staticvoidMethod2()
<br>{
<br>DisabledObsoleteMethod();
<br>}
<br>
/**////<summary>
<br>///克制过时办法挪用此办法
<br>///</summary>
<br>staticvoidDisabledObsoleteMethod()
<br>{
<br>//假如挪用此办法的办法中有"Obsolete"标志则不同意持续运转
<br>}
在下面代码中,我们要在DisabledObsoleteMethod函数里限定具有“Obsolete”属性的办法挪用,我们怎样往做呢?
在.Net中供应了一个"StackFrame"类用于暗示以后线程上的函数挪用仓库中的某个详细函数,以是我们经由过程它便可持续编写我们的DisabledObsoleteMethod函数,代码以下:
/**////<summary>
<br>///克制过时办法挪用此办法
<br>///</summary>
<br>staticvoidDisabledObsoleteMethod()
<br>{
<br>StackFrameframe=newStackFrame(1);//偏移一个函数位,也便是猎取以后函数的前一个挪用函数
<br>MethodBasemethod=frame.GetMethod();//获得挪用函数
<br>//反射猎取其特征
<br>object[]attributes=method.GetCustomAttributes(typeof(ObsoleteAttribute),false);
<br>if(attributes.Length>0)
<br>
<br>
<br>{
<br>//包括有"Obsolete"标志抛堕落误或做别的处置
<br>thrownewException(string.Format("办法{0}包含有Obsolete属性已被克制挪用",method.Name));
<br>}
<br>
<br>//持续做别的操纵
<br>}
到此,当运转Method1时我们的DisabledObsoleteMethod函数就能够一般运作,而Method2就会被抛出非常告诫了
<br>
由于StackFrame的机关函数能够指定偏移量,以是我们可使用它猎取挪用我们的函数时函数挪用仓库里都有些甚么函数,也便是能够懂得到以后程序的一个流程是怎样的,示例代码以下:
<br>classTest
<br>{
<br>staticvoidMain()
<br>{
<br>intoffset=0;
<br>do
<br>{
<br>StackFrameframe=newStackFrame(offset++);
<br>MethodBasemethod=frame.GetMethod();
<br>if(method==null)break;//假如偏移地位没有函数时,则GetMethod办法前往null
<br>Console.WriteLine(method.Name);
<br>
<br>}while(true);
<br>Console.Read();
<br>}
<br>}
实在.NET已为我们供应了一个StackTrace类,其能够猎取函数挪用仓库里的一切函数的有序汇合,经由过程它我们就可以将下面的代码简化为上面的代码了,以下:
<br>classTest
<br>{
<br>staticvoidMain()
<br>{
<br>StackTracetrace=newStackTrace();
<br>foreach(StackFrameframeintrace.GetFrames())
<br>{
<br>Console.WriteLine(frame.GetMethod().Name);
<br>}
<br>Console.Read();
<br>}
<br>}
二者输入的了局仍是一样的
<br>,以下:
<br>Main
<br>_nExecuteAssembly
<br>ExecuteAssembly
<br>RunUsersAssembly
<br>ThreadStart_Context
<br>Run
<br>ThreadStart
看来在把持台程序中也是由某个线程托付入手下手运作的
<br>
来自:http://www.ckuyun.com/kingthy/archive/2008/04/19/1160816.html
#4楼2008-04-1913:54YannicYang有个疑问
那假设过时的Method2挪用了未过时的Mehtod3,未过时的Method3挪用了DisabledObsoleteMethod()这类情形可否过滤呢?
必定必要用一个foreach判别仓库上一切函数?
别的,不晓得多线程情形下有无成绩#7楼[楼主]2008-04-1920:58Kingthy@YannicYang
假如是这类情形则只能一级级往上找了.
多线程也是没有成绩的,由于StackFrame是暗示以后线程(!!)的挪用仓库中的一个函数挪用!l无论谁倒了对双方阵营的粉丝们也是有害无益。 |