gpt4 book ai didi

c# - 在循环中创建新对象

转载 作者:太空狗 更新时间:2023-10-30 00:23:51 25 4
gpt4 key购买 nike

我遇到了一些 C# 初学者问题。但我很确定它很容易解决。

foreach(var test in Tests)
{
object testObj = new object();
//Do something with the object
}

如果我这样做,对象 testObj 会在我每次执行循环时被覆盖。是否可以不每次都覆盖它?还是我必须使用数组?

编辑:好的,抱歉,我会尝试更具体一些:我的目标是在这个循环中创建一些对象,然后为每个对象调用一个新线程。在那里我想对该对象做一些事情,当我完成后我想释放它。

Thomas 的 Edit2:

foreach (var test in Tests)
{
object testObj = new object();
//Set some properties of the object
Thread t = new Thread(() => manager(testObj));
t.Start();
}

public void manager(object testObj)
{
//Do something with the object

//Release it
}

最佳答案

您的问题有两个方面。

  1. 变量的生命周期。局部变量仅存在于定义它的 block 中。因此,您在 foreach 循环内定义了 testObj。因此,它只存在于 block 的一次迭代中,并在循环结束时结束。下一次迭代会有一个新的 testObj。

因此

object testObj 

foreach(var test in Tests)
{
testObj = new object();
//Do something with the object
}

将解决此问题,因为 testObj 是在循环外部定义的,因此无论迭代如何,都与值集保持一致。

然后

  1. 你总是重新设置它。如果将变量设置为新值,旧值将被新值覆盖。因此,如果您想保存您创建的每个 testObj(或为每个 testObj 使用 1 个变量,但通常只有完整的初学者才这样做),您将不得不使用列表、数组……只是为了完整性而提及它并提及这是不应该做的事情,因为它会大大增加您的开销)。

所以你可以这样做:

List testObjList = new List();

foreach (var tests in Tests)
{
testObjList.Add(new object());
// Or alternatively object testObj = new object(); testObjList.Add(testObj);
}

如果您将它直接添加到列表中 (Add(new object)),您可以使用 testObjList[testObjList.Count - 1] 访问它(count-1 因为索引以 0 开头而不是1).这与使用第二个变体的 testObj 时相同。

编辑:要在线程内使用它们然后消除这些对象,您有 2 个选择。

1.) 该对象没有任何处置功能,那么您的原始代码在那里就可以了:

foreach(var test in Tests)
{
object testObj = new object();
//Do something with the object
}

对象在 block 结束时丢失,但垃圾收集器决定何时真正删除它(有一些异常(exception)情况,例如图像,您可能需要执行特殊操作才能删除它们)。

如果你的对象是一个特定的类(我们称它为 myobject 以免与普通对象混淆),它具有它提供的处置功能:

foreach(var test in Tests)
{
using (myObject testObj = new myObject())
{
//Do something with the object
}
}

这意味着 myObject 对象仅存在于 using block 中,此外,当 block 结束时(即使通过异常)执行处置部分,这应确保垃圾收集器能够释放内存。

关于c# - 在循环中创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33820966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com