我不确定这是可能的,但如果是的话,我会喜欢它。我有一个类的实例(即一个对象)a1
,我希望能够在该对象中调用一个方法,该方法建议用另一个对象a2
替换它自己。我真的希望原始对象(a1
)为a2
,这样如果您在a1.GetHashCode()
内调用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
。
答案 0 :(得分:1)
通过“替换”另一个实例,您基本上希望能够做的是为包含该实例的变量分配不同的值。一种方法可能如下:
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);
}
}
答案 1 :(得分:-1)
我认为不可能;为什么不使用ref Object A和ref Object B作为参数来创建一个静态方法(在MyObject类之外)?
static void replace(ref object a,ref object b)
{
a = b;
}
工作代码:
class Program
{
static void replace(ref ObjectA a, ref ObjectA b) {
a = b;
}
static void Main(string[] args)
{
ObjectA a = new ObjectA();
ObjectA b = new ObjectA();
Console.Write("a: " + a.GetHashCode() + "\n");
Console.Write("b: " + b.GetHashCode() + "\n");
Console.Read();
replace(ref a, ref b);
Console.Write("a: " + a.GetHashCode() + "\n");
Console.Write("b: " + b.GetHashCode() + "\n");
Console.Read();
}
}
class ObjectA
{
}