️ 扩展方法的三大铁律仅仅在参数前加this是不够的C# 编译器对扩展方法有极其严格的“连带要求”。你截图里的代码完美地遵守了这三点类必须是静态的 (static class)扩展方法不能写在普通的类里面。它必须被包裹在一个public static class里面比如通常会建一个叫StringExtensions的类。方法必须是静态的 (static method)就像你截图里的public static int GetInt(...)方法本身也必须用static修饰。第一个参数加上this这是你已经完全领悟的一点this后面跟着的类型就是你要“挂载”这个方法的真实目标。在你的截图里this string str意味着你要把GetInt这个方法强行挂载到 C# 所有的字符串string身上。 对比实战为什么要这么写扩展方法的本质其实是微软为了让代码更好看而给程序员发的一颗语法糖。如果没有扩展方法传统的静态调用你只能像调用普通工具类一样去使用它代码看起来很生硬而且打断了阅读逻辑。C#string numStr 123; // 传统写法把变量当作参数塞进去 int result StringHelper.GetInt(numStr);有了扩展方法有了this的魔力因为你加了this string strC# 编译器允许你直接在任何字符串变量后面打一个点.这个方法就会像原生方法一样神奇地弹出来C#string numStr 123; // 现代优雅写法顺着思维逻辑直接点出来 int result numStr.GetInt() 核心总结当你写下numStr.GetInt()的那一瞬间C# 编译器在底层其实偷偷帮你把它翻译成了StringHelper.GetInt(numStr)。所以加上this的意义就是告诉编译器“别把我当成普通的参数我是你要外挂的目标对象把我前面的那个变量直接当成参数传进来吧”你的直觉非常敏锐这就是扩展方法的全部真相。1.this修饰的就是被扩展的类型没错GetInt(this string str)里的this string就是在明确地告诉 C# 编译器“我要把这个方法强行挂载到string这个类型上”。这就是为什么你在任何字符串变量后面打一个.都能像调用原生方法一样看到它。2. 铁律一个方法里只能有一个this且必须是第一个参数你猜测的Gent(this string str, this int num)在 C# 中是绝对不允许的编译器会直接标红报错。 为什么底层不允许有两个this我们回到扩展方法诞生的初衷和调用逻辑上来想一想 扩展方法是为了让我们能用变量.方法名()的优雅形式来写代码。那个放在.前面的唯一变量就是this所指代的目标对象宿主。因为一个点.的前面只能出现一个实例对象自然也就只能指定一个this目标了。你无法在语法上同时用两个对象去“点”出一个方法。 正确实战如果需要传入多个参数怎么办如果你不仅需要扩展string还需要在调用时传入一个int num正确的做法是只有第一个参数加this作为挂载目标后面的参数全部像普通方法一样正常写。✅ 正确的定义方式C#public static class StringExtensions { // 第一个参数指明宿主(加 this) // 第二个、第三个参数就是普通的传参(不加 this) public static int GetInt(this string str, int num) { // 示例将字符串转换后加上你传入的 num int result; int.TryParse(str, out result); return result num; } }✅ 优雅的调用方式C#string myStr 100; // myStr 自动对应了底层参数里的 this string str // 括号里的 5对应了底层参数里的 int num int finalValue myStr.GetInt(5);一句话总结你的领悟this在扩展方法里是一张唯一的“通行证”用来绑定宿主对象方法如果还需要其他材料参数直接按顺序排在this参数的后面即可。你对代码逻辑的推演能力非常出色