更改(void)扩展方法中的值

所以我有这个模拟扩展方法,它将值更改为另一个值:

public static void ChangeValue(this int value, int valueToChange) { value = valueToChange; } 

当我尝试使用它时:

 int asd = 8; asd.ChangeValue(10); Debug.Log(asd); 

它返回8而不是10.虽然值在ChangeValue方法中发生了变化,但它没有改变“asd”的值。 我需要向该方法添加什么,使其更新为“asd”?

int是一个struct所以它是一个value-type 。 这意味着它们是通过值而不是通过引用传递的。 类是reference-types ,它们的行为不同,它们通过引用传递。

您可以选择创建这样的静态方法:

 public static void ChangeValue(ref int value, int valueToChange) { value = valueToChange; } 

并使用它:

 int a = 10; ChangeValue(ref a, 15); 

如果不使用return值或ref参数,则无法执行此操作。 后者不适用this (扩展方法),所以最好的选择是return值(而不是void )。

根据这个答案: https : //stackoverflow.com/a/1259307/1945651 ,在C#中没有办法做到这一点。 像int这样的原始类型是不可变的,如果没有outref修饰符则不能修改,但语法不允许outref

我认为你最好的情况是让扩展方法返回修改后的值而不是试图修改原始值。

显然这在VB.NET中是可能的,如果你绝对需要它,你可以在VB.NET程序集中定义你的扩展方法,但它可能首先不是一个很好的做法。

我知道为时已晚,但仅仅为了记录,我最近真的想这样做,我的意思是……

 someVariable.ChangeValue(10); 

…显然看起来比下面的方式整洁(这也很好)

 ChangeValue(ref someVariable, 10); 

我设法通过以下方式实现类似的目标:

 public class MyClass { public int ID { get; set; } public int Name { get; set; } } public static void UpdateStuff(this MyClass target, int id, string name) { target.ID = id; target.Name = name; } static void Main(string[] args) { var someObj = new MyClass(); someObj.UpdateStuff(301, "RandomUser002"); } 

请注意 ,如果传递的参数是引用类型,则需要首先实例化它(但不在扩展方法内)。 否则, Leri的解决方案应该有效。

因为int是值类型,所以当您在函数内部传递时,它会按值复制。

要查看函数外部的更改,请将其重写为:

 public static int ChangeValue(this int value, int valueToChange) { //DO SOMETHING ; return _value_; //RETURN COMPUTED VALUE } 

可以使用ref keyowrd,但它不能应用于参数,所以在你的情况下,只返回结果值。