ASP.NET网站制作之C#:让您晓得您的办法是被何“人”挪用仓酷云
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。大概在某些场所下我们想晓得本人的某个办法是被谁(哪一个办法)挪用的?好比上面的例子:<br>
<br>/**////<summary>
<br>///一般办法
<br>///</summary>
<br>staticvoidMethod1()
<br>{
<br>DisabledObsoleteMethod();
<br>}
<br>
/**////<summary>
<br>///过时办法
<br>///</summary>
<br>
<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无论谁倒了对双方阵营的粉丝们也是有害无益。 主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。 网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项! ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 那么,ASP.Net有哪些改进呢? 由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
页:
[1]