能否使用C#扩展方法直接修改变量值为方法返回值?
能不能用扩展方法直接更新变量值?
首先给结论:你现在写的这种扩展方法做不到。原因很简单——float是值类型,值类型默认按值传递,你的扩展方法里的this float value只是原变量的副本,方法里的计算只会修改这个副本,根本碰不到原变量本身。
要实现“直接修改原变量,不用显式赋值”的效果,给你几个可行的方案:
方案1:用带ref参数的普通方法(最推荐)
C#不允许扩展方法使用ref this参数,所以换个思路,写个普通静态方法,用ref参数直接操作原变量:
public static void Remap(ref float value, float min1, float max1, float min2, float max2) { value = (value - min1) / (max1 - min1) * (max2 - min2) + min2; }
调用的时候直接传ref即可:
Remap(ref distance, 0, 2, 120, 80);
这样distance的值就直接被修改了,不用再写赋值语句。
方案2:把float包装成引用类型
如果一定要用类似扩展方法的链式调用语法,可以自己写个引用类型包装float:
public class MutableFloat { public float Value { get; set; } public MutableFloat(float initialValue) => Value = initialValue; public void Remap(float min1, float max1, float min2, float max2) { Value = (Value - min1) / (max1 - min1) * (max2 - min2) + min2; } }
使用的时候要先实例化这个包装类:
var distance = new MutableFloat(1.5f); distance.Remap(0, 2, 120, 80); // 此时distance.Value就是修改后的值
但这种方式需要额外的类型包装,会增加代码复杂度,除非有特殊需求,否则不如方案1省事。
方案3:用ref struct(C# 7.2及以上)
可以用ref struct来包装原变量的引用,再给它加扩展方法,不过同样需要额外定义类型:
public ref struct MutableFloatRef { public ref float Value; public MutableFloatRef(ref float value) => Value = ref value; public void Remap(float min1, float max1, float min2, float max2) { Value = (Value - min1) / (max1 - min1) * (max2 - min2) + min2; } } public static MutableFloatRef AsMutable(this ref float value) { return new MutableFloatRef(ref value); }
调用方式:
float distance = 1.5f; distance.AsMutable().Remap(0, 2, 120, 80);
这种方式不用显式赋值,但还是要额外写结构,适合频繁修改值类型的场景。
总的来说,最简洁实用的就是方案1,用带ref参数的普通方法,能直接达到你要的效果。
内容的提问来源于stack exchange,提问作者Matheus Tambosi
相关产品推荐
相关产品推荐

