邪修 C# ,10 段“千萬別上生產(chǎn)”的黑魔法代碼
——僅供技術(shù)獵奇,切勿真用!
?? 每條都踩紅線:可讀性 0、維護(hù)成本 ∞、編譯器警告拉滿、運(yùn)行時(shí)炸鍋。
面試炫技 OK,項(xiàng)目敢用就等死。
1?? 一行 Main
都不要的程序
class P{static P(){Console.WriteLine("邪修C#");Environment.Exit(0);}}
靜態(tài)構(gòu)造函數(shù)當(dāng)入口,CLR 還沒熱身就被踢下線。
2?? 反射暴力改 string
var s = "abc";
typeof(string).GetField("_firstChar",
BindingFlags.NonPublic | BindingFlags.Instance)!
.SetValueDirect(__makeref(s), 'X');
Console.WriteLine(s); // Xbc
string
本不可變?邪修眼里全是可變。
3?? 運(yùn)行期生成 IL 并執(zhí)行
var ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("Evil"), AssemblyBuilderAccess.Run);
var mb = ab.DefineDynamicModule("Evil");
var tb = mb.DefineType("EvilType");
var m = tb.DefineMethod("Run", MethodAttributes.Public | MethodAttributes.Static, typeof(int), null);
var il = m.GetILGenerator();
il.Emit(OpCodes.Ldc_I4_S, 42); il.Emit(OpCodes.Ret);
var t = tb.CreateType();
Console.WriteLine(t.GetMethod("Run")!.Invoke(null, null)); // 42
自帶 JIT,AOT 當(dāng)場(chǎng)退役。
4?? 動(dòng)態(tài)表達(dá)式樹 “寫代碼”
var add = Expression.Lambda<Func<int,int,int>>(
Expression.Add(Expression.Parameter(typeof(int),"a"),
Expression.Parameter(typeof(int),"b")),
Expression.Parameter(typeof(int),"a"),
Expression.Parameter(typeof(int),"b")).Compile();
Console.WriteLine(add(1,2)); // 3
一行把表達(dá)式樹當(dāng)腳本引擎。
5?? 利用 dynamic
繞過編譯期檢查
dynamic obj = new ExpandoObject();
obj.Foo(); // 運(yùn)行時(shí)報(bào)錯(cuò),編譯器零提示
靜態(tài)類型語(yǔ)言秒變 JavaScript。
6?? 隱式轉(zhuǎn)換 + 運(yùn)算符重載地獄
struct EvilInt
{
public int Value;
public static implicit operator int(EvilInt e) => e.Value;
public static EvilInt operator +(EvilInt a, EvilInt b) => new EvilInt { Value = a.Value - b.Value };
}
var a = new EvilInt{Value=5};
var b = new EvilInt{Value=3};
Console.WriteLine(a + b); // 2
+
變-
,同事看了想打人。
7?? 異常過濾器當(dāng) goto
try { throw new Exception("boom"); }
catch when (Console.ReadLine() == "continue") { Console.WriteLine("跳過"); }
異常邏輯取決于 用戶輸入,調(diào)試器原地發(fā)瘋。
8?? 利用 fixed
+ 指針改托管數(shù)組
int[] arr = {1,2,3};
fixed (int* p = arr)
*(p + 1) = 999;
Console.WriteLine(arr[1]); // 999
托管堆秒變裸指針,GC 直接報(bào)警。
9?? #line
偽裝代碼行號(hào)
#line 100 "fake.cs"
Console.WriteLine("我在第 100 行"); // 實(shí)際在第 3 行
棧跟蹤、調(diào)試器全部被騙。
?? 異步死鎖自爆
async Task BoomAsync() => await Task.Delay(1).ConfigureAwait(false);
var task = BoomAsync();
task.Wait(); // 立即死鎖
控制臺(tái) / WinForms 線程直接卡死。
邪修口訣
“反射能拆天,表達(dá)式能寫天,指針能翻天;
編譯器警告當(dāng)耳旁風(fēng),運(yùn)行時(shí)爆炸當(dāng)煙花看?!?/p>
PS
想要正經(jīng)學(xué)習(xí) C# 從編程獅《C# 入門課程》開始!