.NET 通用列表问题,按设计工作,需要解决。 增加价值而不是参考

发布于 2024-08-01 19:19:16 字数 549 浏览 5 评论 0原文

我有一个 List 并且我需要避免我即将概述的行为:

    // assume cls and numberToAdd are parameters passed in.
    int pos = numberToAdd;
    List<MyClass> objs = new List<MyClass>(numberToAdd);

    for(int i = 0; i < numberToAdd; i++)
    {
        objs.Add(cls);
        objs[i].X = -((pos * cls.Width) + cls.Width / 2);
        pos--;
    }

    Console.WriteLine(objs[0].X + "\r\n" + objs[1].X);

这会导致此写入行打印相同的值。

基本上我需要的是改变“Add”方法的行为。 我想添加具有相同值的对象的新实例,而不仅仅是对同一对象的引用。 我知道这会使用更多内存。

I have a List<T> and I need to avoid the behavior I'm about to outline:

    // assume cls and numberToAdd are parameters passed in.
    int pos = numberToAdd;
    List<MyClass> objs = new List<MyClass>(numberToAdd);

    for(int i = 0; i < numberToAdd; i++)
    {
        objs.Add(cls);
        objs[i].X = -((pos * cls.Width) + cls.Width / 2);
        pos--;
    }

    Console.WriteLine(objs[0].X + "\r\n" + objs[1].X);

This results in this writeline printing the same value.

Basically what I need is to change the behavior of the "Add" method. I'd like to add a new instance of the object with the same values and not simply a reference to the same object. I understand this will use alot more memory.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

晒暮凉 2024-08-08 19:19:16

看起来像同一个对象,cls 正在向列表中添加 numberToAdd 次。

您需要在循环内创建对象的新实例。

for(int i = 0; i < numberToAdd; i++)
{
    MyClass c=new MyClass(...);
    c.X = -((pos * c.Width) + c.Width / 2);
    objs.Add(c);
    pos--;
}

Looks like the same object, cls is getting added numberToAdd times to the list.

You need to create a new instance of your objects inside the loop.

for(int i = 0; i < numberToAdd; i++)
{
    MyClass c=new MyClass(...);
    c.X = -((pos * c.Width) + c.Width / 2);
    objs.Add(c);
    pos--;
}
紫轩蝶泪 2024-08-08 19:19:16

让 MyClass 实现 ICloneable 然后简单地使用

objs.Add((MyClass)cls.Clone());

Have MyClass Implement ICloneable and then simply use

objs.Add((MyClass)cls.Clone());
稍尽春風 2024-08-08 19:19:16

可能想要扩展 cls 以包含克隆方法。 如果您无法修改 cls 类,则扩展方法将起作用。

然后改变
objs.Add(cls);

objs.Add(cls.Clone());

Might want to extend cls to include a clone method. Extension method would work if you can't modify the cls class.

then change
objs.Add(cls);
to
objs.Add(cls.Clone());

彡翼 2024-08-08 19:19:16

啊。 您需要将 cls 实现为结构体,以便它展现按值传递语义。

或者您需要在 cls 对象上实现一个克隆方法,以便您可以创建一个方法来克隆该对象,从而创建对其的新引用,以便您可以执行此操作。

即使您无权访问对象本身,您也可以创建一个扩展方法来执行此操作。

public cls Clone(this cls)
{
    //initialise the object to clone it.
    return new cls(this.param1, this.param2,...) 
}

Ah. You need to implement cls as a struct so that it exhibits pass by value semantics.

OR you need to implement a clone method on your cls object so that you can create a method to clone the object and thus create a new reference to it so that you can do this.

Even if you don't have access to the object itself you may be able to create an extension method to do this.

public cls Clone(this cls)
{
    //initialise the object to clone it.
    return new cls(this.param1, this.param2,...) 
}
触ぅ动初心 2024-08-08 19:19:16

“cls”变量是什么? 只需在每个循环内创建一个新循环即可。 你想要做的就是克隆它; 但老实说这会令人困惑。 我建议每个循环创建一个新的。

-- 编辑

注意到您会评论“cls”。

我建议您然后克隆它(假设您无法更改呼叫并执行我的上述建议)。 只需创建一个新属性并复制所有属性即可完成此操作。

通常,如果您可以控制“cls”的类型,则只需创建一个“复制”构造函数即可。 就像这样:

class Foo {
    private int x;

    public Foo (Foo toCopy) {
       this.x = toCopy.x;
    }

    ...
}

What is the 'cls' variable? Just create a new one inside each loop. What you want to do is clone it; but honestly that'll be confusing. I'd suggest just creating a new one per loop.

-- Edit

Noticed you'd comment about 'cls'.

I suggest you clone it then (assuming you can't change the call and do my above suggestion). Do this by just creating a new one, and copying all the properties over.

Typically, if you have control of the Type of 'cls', you just make a 'Copy' constructor. It's like so:

class Foo {
    private int x;

    public Foo (Foo toCopy) {
       this.x = toCopy.x;
    }

    ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文