Point结构体扩展方法无法实现偏移及链式调用的问题咨询
问题原因与解决方案
问题出在Point是值类型(struct),扩展方法的参数默认是值传递——你在Add方法里修改的只是原p1的副本,原实例不会被改变,而且你调用时没有接收方法返回的新实例,所以p1的值始终没变。
修复方法
不需要修改你的扩展方法(它已经正确返回了修改后的新Point实例),只需要在调用时接收返回值,把新实例赋值给原变量:
var p1 = new Point(1, 2); Console.WriteLine("Before p1:{0}", p1); // 接收扩展方法返回的新实例,更新p1 p1 = p1.Add(new Point(1, 0)); Console.WriteLine("After p1:{0}", p1);
运行结果会符合预期:
Before p1:{ X = 1,Y = 2} After p1:{ X = 2,Y = 2}
链式调用支持
你的扩展方法设计已经满足链式调用需求,只要保证每个后续方法(比如Round、RotateAround)都返回新的Point实例,就可以直接链式调用,最后把结果赋值给变量即可:
var p2 = new Point(5, 5); // 链式调用:依次执行Add→Round→RotateAround,最终得到处理后的新实例 var processedPoint = p1.Add(new Point(1, 0)) .Round() .RotateAround(p2, 45);
补充说明
值类型和引用类型的参数传递逻辑不同:引用类型传递的是引用,修改参数会影响原实例;但值类型传递的是副本,修改副本不会影响原实例。所以对于struct类型,这类"修改"操作的扩展方法都应该返回新实例,再通过赋值来更新原变量。
内容的提问来源于stack exchange,提问作者Orien
相关产品推荐
相关产品推荐

