。我真的希望原始对象 (a1) 成为 a2-6ren">
gpt4 book ai didi

c# - 有什么办法可以在一个对象中将它与另一个对象一起设置为 "replace itself"吗?

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:37 24 4
gpt4 key购买 nike

我不确定这是否可能,但如果可以的话我会很高兴。我有一个类的实例(即一个对象)a1,我希望能够在该对象中调用一个方法,该方法建议它用另一个对象 a2 替换自身>。我真的希望原始对象 (a1) 成为 a2,这样如果您在 Main( ) 它将是与 a2 相同的哈希码。

例如:

class Program
{
static MyObject a2 = new MyObject(1000);

static void Main(string[] args)
{
MyObject a1 = new MyObject(1); // Create an Object
a1.ReplaceMe(ref a2); // Try to replace it

Console.WriteLine("X = " + a1.x);
Console.ReadLine();
}
}

class MyObject
{
public int x;

public MyObject(int x)
{
this.x = x;
}

public void ReplaceMe(ref MyObject somethingElse)
{
this = somethingElse; // REPLACE ITSELF? (not allowed)
return; // GAURANTEED TO DIRECTLY RETURN
}
}

但显然 this = somethingElse; 是不允许的,因为 this 是只读的。我明白为什么不允许这样做(谁知道执行是否完成),但我可以保证你会立即返回。

有什么办法解决这个问题吗?


编辑:通过一个例子更多地说明我为什么要寻找这样的设计。这是总体目标。想象一个平台,它解析关于人的数据,当它找到关于它的人的信息时,它会使用该信息创建 Person 的实例。你可以得到一个句柄做那个人:

Person person1 = platform.GetPerson(based_on_data);

现在,假设该平台有两个 Person 实例,它认为这是不同的人,但突然间出现的信息强烈表明这两个实例实际上指的是同一个人。因此,平台希望将这些实例合并到一个新对象中,我们称之为 personX

现在,在平台上四处游荡的人拥有这两个已合并实例之一的副本,即 person1。我想要做的是即时将 person1 替换为 personX。从字面上看,我希望 person1==personX 为真,而不仅仅是它们是具有相同数据的两个不同对象。

由于我无法即时将 person1 替换为 personX,所以我认为我不会直接访问 Person,相反,我会授予对 PersonPtr 的访问权限,平台可以(即时)更改它指向的 Person

最佳答案

通过将一个实例“换出”另一个实例,您本质上希望能够为包含该实例的变量分配一个不同的值。执行此操作的一种方法如下:

class Program
{
static void Main(string[] args)
{
MyObject a1 = null, a2 = null;

MyObject.Create(i => a1 = i);
MyObject.Create(i => a2 = i);

Console.WriteLine("a1 hashcode:" + a1.GetHashCode()); // 46104728
Console.WriteLine("a2 hashcode:" + a2.GetHashCode()); // 12289376

a1.SwapWith(a2);

Console.WriteLine("a1 hashcode:" + a1.GetHashCode()); // 12289376
Console.WriteLine("a2 hashcode:" + a2.GetHashCode()); // 46104728
}
}

class MyObject
{
private Action<MyObject> _assigner;
private MyObject() { }
public static void Create(Action<MyObject> assigner = null)
{
var newInstance = new MyObject();
newInstance._assigner = assigner;

newInstance.Assign();
}

public void SwapWith(MyObject replacement)
{
replacement._assigner = Interlocked.Exchange(ref this._assigner, replacement._assigner);

this.Assign();
replacement.Assign();
}

private void Assign()
{
if (_assigner != null) _assigner(this);
}
}

关于c# - 有什么办法可以在一个对象中将它与另一个对象一起设置为 "replace itself"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28241605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com