扩展方法不更新自身
extension method not updating itself
给定以下对象及其扩展名:
public class MyObj
{
string var1 = "100";
string var2 = "200";
}
public static void DoSomething(this MyObj myobj)
{
myobj = new MyObj()
myobj.var1 = "100000";
myobj.var2 = "200000";
}
注意扩展方法实例化一个新实例并将其分配给自己。但是,当我这样做时,我的对象实际上并没有按预期更新。它仍然包含旧的变量值并且保持不变。
MyObj myobj = new MyObj();
myobj.DoSomething();
//myobj.var1 is still 100, but expected it to be 100000;
//myobj.var1 is still 200, but expected it to be 200000;
如何让我的对象按预期更新 - 这可以做到吗?
您不能通过扩展方法将另一个实例分配给自身。您只是在更改对局部变量 myobj
.
的引用
您可以通过静态方法使用ref
:
执行此操作
public static void DoSomething(ref MyObj myobj)
{
myobj = new MyObj()
myobj.var1 = 100000;
myobj.var2 = 200000;
}
用法:
MyObj myobj = null;
DoSomething(ref myobj);
// myobj is set here
您可以使用这样的构造函数创建一个新对象。
MyObj(int x, int y)
{
var1 = x;
var2 = y;
}
并像这样打电话:
MyObj myobj = new MyObj(100,200);
如果您想保留扩展方法,另一种方法:
public static MyObj DoSomething(this MyObj myobj)
{
myobj = new MyObj()
myobj.var1 = "100000";
myobj.var2 = "200000";
return myobj;
}
然后你就这样使用它
MyObj myobj = new MyObj();
myobj = myobj.DoSomething();
请注意,如果您的DoSomething
方法只是用于重置对象,您还不如使用构造函数。
给定以下对象及其扩展名:
public class MyObj
{
string var1 = "100";
string var2 = "200";
}
public static void DoSomething(this MyObj myobj)
{
myobj = new MyObj()
myobj.var1 = "100000";
myobj.var2 = "200000";
}
注意扩展方法实例化一个新实例并将其分配给自己。但是,当我这样做时,我的对象实际上并没有按预期更新。它仍然包含旧的变量值并且保持不变。
MyObj myobj = new MyObj();
myobj.DoSomething();
//myobj.var1 is still 100, but expected it to be 100000;
//myobj.var1 is still 200, but expected it to be 200000;
如何让我的对象按预期更新 - 这可以做到吗?
您不能通过扩展方法将另一个实例分配给自身。您只是在更改对局部变量 myobj
.
您可以通过静态方法使用ref
:
public static void DoSomething(ref MyObj myobj)
{
myobj = new MyObj()
myobj.var1 = 100000;
myobj.var2 = 200000;
}
用法:
MyObj myobj = null;
DoSomething(ref myobj);
// myobj is set here
您可以使用这样的构造函数创建一个新对象。
MyObj(int x, int y)
{
var1 = x;
var2 = y;
}
并像这样打电话:
MyObj myobj = new MyObj(100,200);
如果您想保留扩展方法,另一种方法:
public static MyObj DoSomething(this MyObj myobj)
{
myobj = new MyObj()
myobj.var1 = "100000";
myobj.var2 = "200000";
return myobj;
}
然后你就这样使用它
MyObj myobj = new MyObj();
myobj = myobj.DoSomething();
请注意,如果您的DoSomething
方法只是用于重置对象,您还不如使用构造函数。