所以我有这个模拟扩展方法,它将值更改为另一个值:
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”?
答案 0 :(得分:10)
int
是struct
所以它是value-type
。这意味着它们是通过值而不是通过引用传递的。类是reference-types
,它们的行为不同,它们通过引用传递。
您的选择是创建这样的静态方法:
public static void ChangeValue(ref int value, int valueToChange)
{
value = valueToChange;
}
并使用它:
int a = 10;
ChangeValue(ref a, 15);
答案 1 :(得分:9)
如果不使用return
值或ref
参数,则无法执行此操作。后者与this
(扩展方法)不兼容,所以最好的选择是return
值(而不是void
)。
答案 2 :(得分:1)
根据这个答案:https://stackoverflow.com/a/1259307/1945651,在C#中没有办法做到这一点。像int
这样的原始类型是不可变的,如果没有out
或ref
修饰符则无法修改,但语法不允许out
或ref
。
我认为最好的情况是让扩展方法返回修改后的值而不是尝试修改原始值。
显然这在VB.NET中是可行的,如果你绝对需要它,你可以在VB.NET程序集中定义你的扩展方法,但它首先可能不是一个很好的做法。
答案 3 :(得分:1)
我知道为时已晚,但仅仅为了记录,我最近真的想这样做,我的意思是......
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's solution应该有效。
答案 4 :(得分:0)
因为int
是值类型,所以当您在函数内部传递时,它会按值复制。
要查看该函数的外部的更改,请将其重写为:
public static int ChangeValue(this int value, int valueToChange)
{
//DO SOMETHING ;
return _value_; //RETURN COMPUTED VALUE
}
可以使用 ref keyowrd,但它不能应用于this
的参数,所以在你的情况下,只需返回结果值。
答案 5 :(得分:0)
旧问题,但是在C#的较新版本上,您现在可以通过同时使用this和ref关键字对值类型进行此操作。即使在此扩展方法之外,这也会将value设置为与valueToChange相同。
public static void ChangeValue(this ref int value, int valueToChange)
{
value = valueToChange;
}
我认为this change是针对15.1版的编译器制作的,我认为它对应于C#7(或其子版本之一)。我没有立即找到此功能的正式公告。