【问题标题】:Java clone() in C#C# 中的 Java 克隆()
【发布时间】:2015-01-14 11:38:24
【问题描述】:

我正在将代码从 Java 重写为 C#。 我对 C# 中的克隆函数有疑问。

代码在 Java:

public Tour(ArrayList tour)
{
    this.tour = (ArrayList) tour.clone();
}

我的代码在 C#:

public Tour(List<City> tour)
{
    //What I should do here?
}

我在 C# 中尝试了一些克隆技术,但没有结果。

编辑:

此解决方案完美运行:

this.tour = new List<City>();
tour.ForEach((item) =>
{
     this.tour.Add(new City(item));
});

您好!

【问题讨论】:

  • “我在 C# 中尝试了一些克隆技术...” - 您到底尝试了什么,出了什么问题?
  • 这里的玩笑是 C# 还包含 ArrayList,其中还包含 Clone 方法,该方法与 Java 中的功能相同。
  • @S_F 但是使用ArrayList 而不是通用的List&lt;T&gt; 大多不是一个好主意。
  • @AndyKorneyev 是的,但我觉得这种情况很有趣。
  • 这当然是一个 C# 问题,但请注意:很少在 Java 中使用 Cloneable / .clone() 工具是个好主意。实现你自己的克隆机制(无论你的规范需要什么深度),记录它,然后继续。 Java 的克隆从第一天就被打破了。这也不是一个浅薄与深层次的争论。这个设施一团糟。

标签: java c# clone


【解决方案1】:

java.util.ArrayList.clone() 返回此 ArrayList 实例的浅表副本(即不复制元素本身)。
--Source

要在 .NET 的 List&lt;T&gt; 中做同样的事情,您可以这样做:

var newList = oldList.ToList();

【讨论】:

    【解决方案2】:

    您应该在您的 City 类上实现 ICloneable

    这样你就可以做到这一点:

    public List<City> Tour {get; private set;}
    
    public Tour(List<City> tour)
    {
        this.Tour = new List<City>();
        foreach (var city in tour)
          this.tour.Add((City)city.Clone());    
    }
    

    【讨论】:

    • 然而,这并没有像 Java 代码那样做。 Java 代码对 ArrayList 做了一个浅拷贝——元素本身没有被拷贝。 new List&lt;City&gt;(tour) 会在 C# 中使用,new ArrayList(tour) 在 Java 中会比 tour.clone() 更常见
    • 这个问题有点模棱两可,因为Java中的“克隆”显然在C#中有不同的含义。 C# 将是深拷贝,而不是浅拷贝。
    • 好吧,例如C# ArrayList.Clone 的作用与 Java ArrayList.Clone 完全相同——创建一个浅拷贝。但是,C# List 没有 .Clone 方法。
    • 那么“MemberwiseClone”方法还不够吗?
    • @nos:您可以为 IList 编写一个扩展方法,该方法返回 IEnumerable 并且只接受 T 是 ICloneable 的情况。十分简单。 MemberwiseClone 在对象引用的情况下也不安全 - 最好实现适当的 Clone() 方法。
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多