【发布时间】:2009-05-13 19:06:10
【问题描述】:
好的,
也许这是 c# 的设计,或者我的做法是错误的。
请看我下面的代码。我制作了它,您可以将其复制并粘贴到控制台应用程序中并运行它以查看我在说什么。
using System;
namespace ConsoleTest
{
class Program
{
static void Main()
{
var o1 = new oObject
{
Name = "Before Method"
};
var o1b = new oObjectBad
{
Name = "Before Method"
};
Console.WriteLine("Object Bad 1 Before: " + o1b.Name);
oObjectBad o2b = GetNewObjectBad(o1b);
Console.WriteLine("Object Bad 1 After: " + o1b.Name);
Console.WriteLine("Object Bad 2 After: " + o2b.Name);
Console.WriteLine(string.Empty);
Console.WriteLine("Object 1 Before: " + o1.Name);
oObject o2 = GetNewObject(o1);
Console.WriteLine("Object 1 After: " + o1.Name);
Console.WriteLine("Object 2 After: " + o2.Name);
Console.ReadLine();
}
public static oObject GetNewObject(oObject o)
{
oObject newObject = new oObject(o);
newObject.Name = "Changed in Method";
return newObject;
}
public static oObjectBad GetNewObjectBad(oObjectBad o)
{
o.Name = "Changed in Method";
return o;
}
}
class oObject
{
public oObject()
{
}
public oObject(oObject o)
{
Name = o.Name;
}
public string Name { get; set; }
}
class oObjectBad
{
public string Name { get; set; }
}
}
现在,这是我不明白的。
当我将对象传递给方法并更新对象属性“名称”时。然后它更新方法之外的原始对象。
解决这个问题的方法是创建另一个对象(如代码所示)以创建对象的克隆,然后更新克隆,然后返回克隆。
所以问题是这样的: 有没有更简单的方法来传递一个对象并更新该对象的属性,这样我就可以在不更新原始对象的情况下拥有这样的东西。
using System;
namespace ConsoleTest
{
class Program
{
static void Main()
{
var o1 = new oObject
{
Name = "Before Method"
};
Console.WriteLine("Object 1 Before: " + o1.Name);
oObject o2 = GetNewObjectBad(o1);
Console.WriteLine("Object 1 After: " + o1.Name);
Console.WriteLine("Object 2 (New Object) After: " + o2.Name);
Console.ReadLine();
}
public static oObject GetNewObjectBad(oObject o)
{
o.Name = "Changed in Method";
return o;
}
}
class oObject
{
public string Name { get; set; }
}
}
如果这令人困惑,请告诉我,我会看看是否可以更好地解释。
编辑: 我这样做的原因是我需要在数据库中克隆一个对象,并且克隆的对象需要更改几个属性。然后我将使用原始对象的 ID 和新对象的 ID 进行其他数据处理。
谢谢!
【问题讨论】: