邪修 C# 10 连击|反射改 string、运行时 IL、动态表达式树

编程狮(w3cschool.cn) 2025-08-07 12:01:45 浏览数 (124)
反馈

邪修 C# ,10 段“千万别上生产”的黑魔法代码
——仅供技术猎奇,切勿真用!

⚠️ 每条都踩红线:可读性 0、维护成本 ∞、编译器警告拉满、运行时炸锅。

面试炫技 OK,项目敢用就等死。

1️⃣ 一行 Main 都不要的程序

class P{static P(){Console.WriteLine("邪修C#");Environment.Exit(0);}}

静态构造函数当入口,CLR 还没热身就被踢下线。

2️⃣ 反射暴力改 string

var s = "abc";
typeof(string).GetField("_firstChar", 
        BindingFlags.NonPublic | BindingFlags.Instance)!
    .SetValueDirect(__makeref(s), 'X');
Console.WriteLine(s); // Xbc

string 本不可变?邪修眼里全是可变。

3️⃣ 运行期生成 IL 并执行

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 当场退役。

4️⃣ 动态表达式树 “写代码”

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

一行把表达式树当脚本引擎。

5️⃣ 利用 dynamic 绕过编译期检查

dynamic obj = new ExpandoObject();
obj.Foo(); // 运行时报错,编译器零提示

静态类型语言秒变 JavaScript。

6️⃣ 隐式转换 + 运算符重载地狱

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️⃣ 异常过滤器当 goto

try { throw new Exception("boom"); }
catch when (Console.ReadLine() == "continue") { Console.WriteLine("跳过"); }

异常逻辑取决于 用户输入,调试器原地发疯。

8️⃣ 利用 fixed + 指针改托管数组

int[] arr = {1,2,3};
fixed (int* p = arr)
    *(p + 1) = 999;
Console.WriteLine(arr[1]); // 999

托管堆秒变裸指针,GC 直接报警。

9️⃣ #line 伪装代码行号

#line 100 "fake.cs"
Console.WriteLine("我在第 100 行"); // 实际在第 3 行

栈跟踪、调试器全部被骗。

🔟 异步死锁自爆

async Task BoomAsync() => await Task.Delay(1).ConfigureAwait(false);
var task = BoomAsync();
task.Wait(); // 立即死锁

控制台 / WinForms 线程直接卡死。

邪修口诀

“反射能拆天,表达式能写天,指针能翻天;

编译器警告当耳旁风,运行时爆炸当烟花看。”

PS

想要正经学习 C# 从编程狮《C# 入门课程》开始!

C#

0 人点赞