日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

做个游戏:设计代码生成特定的调用堆栈

發布時間:2025/7/25 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 做个游戏:设计代码生成特定的调用堆栈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前篇文章里我談了談String.Concat與StringBuilder的實現,于是后來有個朋友回復到:“我發現StringBuilder里好像也用了String.Concat。在一次異常中,Exception的StackTrace顯示是先發生了String.Concat異常,然后再StringBuilder.Append。”不過經過一些簡單的分析,我們會發現StringBuilder.Append方法的各個重載都沒有依賴(即調用)String.Concat方法,那么這樣的調用堆棧又是如何形成的呢?

展開答案

其實這并不困難,只要簡單“推理”一番便可。雖然StringBuilder的Append方法沒有依賴String.Concat方法,但這只能說明Append方法沒有直接調用String.Concat。然而,只要Append方法有機會調用到我們自定義的邏輯中,便可以由我們的邏輯調用Concat方法。這樣的方法可以是Append(object)重載:

public StringBuilder Append(object value) {if (value == null){return this;}return this.Append(value); }

那么,我們的方法可以調用String.Concat方法,但又如何讓它拋出異常呢?很容易,因為String.Concat方法也有個Concat(object, object)重載會調用參數的ToString方法。不過,如果我們直接調用String.Concat方法也太不自然了些,相信之前那位朋友也不會這么做。但是,其實我們完全可以:

public class InBuilder {public override string ToString(){return "Hello" + new InConcat();} }public class InConcat {public override string ToString(){throw new Exception();} }static void Main() {var builder = new StringBuilder();builder.Append(new InBuilder()); }

看InBuilder的ToString中,將一個字符串與另一個非字符串對象連接起來,而這個連接操作便會被編譯為String.Concat(object, object)方法:

.method public hidebysig virtual instance string ToString() cil managed {.maxstack 8L_0000: ldstr "Hello"L_0005: newobj instance void SimpleConsole.Program/InConcat::.ctor()L_000a: call string [mscorlib]System.String::Concat(object, object)L_000f: ret }

于是執行Main方法便會拋出一個異常,它的StackTrace便是:

at SimpleConsole.Program.InConcat.ToString() in ...at SimpleConsole.Program.InBuilder.ToString() in ...at SimpleConsole.Program.Main() in ... ...

嘿嘿,我是不是很無聊?

轉載于:https://www.cnblogs.com/JeffreyZhao/archive/2009/12/04/stack-trace-with-StringBuilder-and-String-Concat.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的做个游戏:设计代码生成特定的调用堆栈的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。