C#值类型调用扩展方法时,能否获取引用修改自身?
关于值类型扩展方法修改原始对象的问题
嗨,这个问题戳中了C#里值类型和引用类型的核心差异点,我来给你掰扯清楚:
首先,你写的这个AddTo方法完全无法修改原始的int值。为啥?因为int是值类型,而扩展方法的第一个参数默认是按值传递的——也就是说,当你调用someInt.AddTo(5)时,方法里的inInt只是原始someInt的一个副本,你在方法里对inInt做的加法操作,只会改变这个副本的值,原始的someInt根本不会受到任何影响。
那能不能获取调用对象的引用,从而修改它呢?答案是可以,但得用C# 7.2及以上版本支持的ref扩展方法。你需要修改方法的定义,把第一个参数标记为ref:
public static void AddTo(this ref int inInt, int inAmountToAdd) { inInt += inAmountToAdd; }
调用的时候也需要注意,必须把实例以ref的方式传递:
int myNum = 10; ref myNum.AddTo(5); // 这样调用后,myNum的值会变成15
不过这里要提一句:这种ref扩展方法的写法并不常用,因为值类型(比如int)本身设计上偏向不可变,更符合直觉的做法是让扩展方法返回修改后的新值,然后由调用者重新赋值,比如:
public static int AddTo(this int inInt, int inAmountToAdd) { return inInt + inAmountToAdd; } // 调用方式 int myNum = 10; myNum = myNum.AddTo(5); // myNum现在是15
这种写法兼容性更好(不需要依赖高版本C#),也更符合值类型的使用习惯。
内容的提问来源于stack exchange,提问作者Harald Kanin
相关产品推荐
相关产品推荐

