在扩展方法中不可能使用ref和out作为第一个(“this”)参数?
为什么禁止使用ref
修饰符来调用Extension Method
?
这一个是可能的:
public static void Change(ref TestClass testClass, TestClass testClass2) { testClass = testClass2; }
而这一个不是:
public static void ChangeWithExtensionMethod(this ref TestClass testClass, TestClass testClass2) { testClass = testClass2; }
但为什么?
你必须明确指定ref
和out
。 你如何用扩展方法来做到这一点? 而且,你真的想要吗?
TestClass x = new TestClass(); (ref x).ChangeWithExtensionMethod(otherTestClass); // And now x has changed?
或者你想不必指定ref
部分,只是在扩展方法中的第一个参数?
对我来说,这听起来很奇怪,说实话,是一个难以理解的(或至less难以预测的)代码的秘诀。
我同意Jon Skeet等人的答复。 关于如何允许“ref this”扩展方法可能使代码更加模糊。 但是,如果您查看.Net Framework中的某些名称空间,则通常会在结构上调用一个方法来更改它。
以System.Drawing结构为例(Point,Rectangle等)。 其中每一个都有方法(例如Offset,Inflate等)来改变结构本身。 我并不是说这是一个好主意,实际上我个人觉得Offset,Inflate等等会改变结构本身,而不是返回新结构,而且我知道你们中的一些人反对可变结构的概念,一般。
我怀疑有任何情况下,调用引用types的方法将改变引用(除非它是与String
类,我可以想象有可能是一些编译器魔术来切换引用执行实习等)。 因此,防止“this ref”被引用types使用是有意义的,因为改变引用将是调用方法的完全非标准的副作用。
但是在结构方面,允许“这个参考”不会明显降低代码的可读性,而不是Rectangle.Inflate等,它将提供唯一的手段来“模拟”具有扩展function的那种行为。
正如一个侧面说明,这里是“这个参考” 可能是有用的一个例子,恕我直言,仍然可读:
void SwapWith<T>(this ref T x, ref T y) { T tmp = x; x = y; y = tmp; }
我同意它对结构很有用
所以我想build议为struct做扩展方法。 这个关键字应该总是通过引用传递struct
上课总是通过引用传递。 每当我们创build扩展方法,我们希望它像一个真正的方法行事。 所以真正的类和结构的方法可以修改它的值。 扩展方法应该也可以
这意味着调用myObject.ChangeWithExtentionMethod(otherObject)
实际上可能会改变myObject
的值。 国际海事组织,这将不会使非常可读的代码时,可以通过使用常规的非扩展方法与参考,而不是实现所需的效果。
编辑:我的意思是,方法调用应该要求您在任何时候通过引用传递的东西使用ref关键字。 使用ref和扩展方法的'this'参数会违反该行为。