邪修 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# 入门课程》开始!