我想做的事情如下:
MyObject myObj = GetMyObj(); // Create and fill a new object
MyObject newObj = myObj.Clone();
Run Code Online (Sandbox Code Playgroud)
然后更改未在原始对象中反映的新对象.
我不经常需要这个功能,所以当有必要的时候,我已经使用了创建一个新对象然后单独复制每个属性,但它总是让我觉得有更好或更优雅的处理方式情况.
如何克隆或深度复制对象,以便可以修改克隆对象而不会在原始对象中反映任何更改?
我想要一个真正的深拷贝.在Java中,这很容易,但是你如何在C#中做到这一点?
我有一个DataGridView,其数据源设置为自定义对象的通用列表.当用户更改值(在这种情况下检查/取消选中复选框)时,对象中的基础布尔字段会发生变化.
我是否应该创建List的"副本"进行绑定,然后在用户提交时手动更新(如果是这样,如何创建此副本),或者是否有一种简单的方法来回滚对数据源所做的更改.
(我正在使用C#)
我有一个函数,它从列表中获取一个对象作为参数。我创建了这个对象的一个新实例,并使它等于传递给函数的对象。我更改了新对象的一些属性,但这些更改也会应用于列表中的原始对象。例子:
public void myFunction(Object original)
{
var copyOfObject = original;
copyOfObject.SomeProperty = 'a';
}
Run Code Online (Sandbox Code Playgroud)
从阅读中,我想我正在创建原始对象的浅表副本,因此当我更新新对象的属性时,这会导致原始对象的属性更改为?我见过一些复制整个对象列表以创建深层副本的示例,但我只想创建这个单个对象的深层副本,而不是整个列表。我可以这样做而不必做:
copyOfObject = new Object();
copyOfObject.someProperty = original.someProperty;
Run Code Online (Sandbox Code Playgroud)
在进行更改之前?
我正在开展一个相当复杂的项目,并且在过去一小时内一直在努力调试一个问题.我找到了看起来或多或少像这样的麻烦代码:
Client ClientToChange = Clients[index];
ClientToChange.Rank = 80;
Run Code Online (Sandbox Code Playgroud)
客户端是Client类的静态数组,在同一个类中声明.
由于某种原因改变ClientToChange的等级会改变数组的内容,即
Console.WriteLine(Clients[index].Rank)
Run Code Online (Sandbox Code Playgroud)
返回80(而在它之前是100),当然index没有改变.
这对我来说似乎很奇怪,但这就是发生的事情.
我写了一个小的虚拟程序来测试它,只是为了确保:
static string[] foo = new string[10];
static void Main(string[] args)
{
foo[3] = "bar";
string test = "";
test = foo[3];
test = "fb";
Console.Write(foo[3]);
Console.Write(test);
Run Code Online (Sandbox Code Playgroud)
当然,这应该像它应该的那样:打印barfb.
我在做一些我看不到的事情,或者我不知道应该做些什么?
请考虑此代码
some v1=new some();
v1.x=10;
some v2=v1;
v1.x=15;
Console.Write(v2.x);//Show 15
Run Code Online (Sandbox Code Playgroud)
当我在v1上更改x属性时为什么要在v2上更改x的值?
所以我有一个清单:
List<Class> myList = new List<Class>
Run Code Online (Sandbox Code Playgroud)
我创建了一个等于其中一个项目的对象,以便我可以更新它:
Class item = myList[0]
Run Code Online (Sandbox Code Playgroud)
我还有该项目的副本(以便我可以在需要时恢复任何更改):
Class copyItem = myList[0]
Run Code Online (Sandbox Code Playgroud)
当我更新item项目时myList也会更新,这就是我想要的。
但是我不希望 . 发生这种情况,copyItem我该如何制作才能使副本不引用myList?
根据我在C#中的理解,当一个对象被分配给另一个相同类型的对象时,它的引用被复制而不是值.所以我想知道如何将一个对象分配给另一个对象,使其值被复制而不被引用到第二个对象.