【问题标题】:C# Reset a propertyC# 重置属性
【发布时间】:2011-01-07 10:55:56
【问题描述】:

我正在为不可序列化的对象编写克隆函数。对于大多数对象,我不在乎它们是否是浅拷贝,因为我不会对它们进行任何更改。

我从 MemberwiseClone 开始,这会复制所有值和少数对象,例如配置字典,但它们是指针。

EAVEntity newClone = (EAVEntity) this.MemberwiseClone();
newClone.EntityStorageID = Guid.NewGuid();
newClone.Controls.Clear();

那么如何重置指针,使它们不会指向同一个位置?

【问题讨论】:

    标签: c# reference clone


    【解决方案1】:

    准确地说,您使用的不是真正意义上的“指针”,而是引用类型的objects。差别很大。

    如果您希望复制对象的属性不指向同一个其他对象,您可以将其设置为 null、一个新对象或任何其他对象:

    newClone.SomeProperty = null;
    
    newClone.SomeProperty = new WhatEverTypeSomePropertyIs();
    

    【讨论】:

    • 我用 newClone.EntityStorageID = new Guid() 尝试过,但它仍然更新 this.EntityStorageID。我会尝试 null。
    • Nope null (newClone.EntityStorageID = null;) 失败,因为它是不可为空的类型。我的解决方案可能是手动完成整个克隆(一次一个属性),但我仍然对如何通过引用设置对象感到好奇。
    • 如果您将 GUID 设为一种 GUID? (在 VB 中为 Nullable),这将允许您传递 null。 GUID 是一种值类型,而可为空的类型、字符串和类是引用类型,并且会遇到您所说的问题。因此,您可以创建一个可为空的类或具有 GUID 属性的包装类。
    • 你总是可以使用 default(Type),返回 0 代表整数,返回 null 代表对象等。
    猜你喜欢
    • 2012-10-09
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2011-01-16
    相关资源
    最近更新 更多