我在c#中有一个类,名为C.当我执行程序时,我创建了这个类的新对象。在某些时候,我需要创建一个列表List<C> listC = new List();
,我将所有创建的对象放在这里。 当然,我可以在创建这个对象后使用list.Add为每个对象添加。但由于某些原因难以解释,我宁愿将所有曾经创建过thiiss类的对象添加到列表中。把一个类的所有对象放在列表中
这是不是有可能?我不确定是否有解决方案:-)。
在此先感谢所有回答问题的人。
我在c#中有一个类,名为C.当我执行程序时,我创建了这个类的新对象。在某些时候,我需要创建一个列表List<C> listC = new List();
,我将所有创建的对象放在这里。 当然,我可以在创建这个对象后使用list.Add为每个对象添加。但由于某些原因难以解释,我宁愿将所有曾经创建过thiiss类的对象添加到列表中。把一个类的所有对象放在列表中
这是不是有可能?我不确定是否有解决方案:-)。
在此先感谢所有回答问题的人。
当您创建对象,例如你可以只直接添加到列表:
List<C> list = new List<C>();
for(var i = 0; i < 10; i++) {
list.Add(new C());
}
或者你可以在列表传递给类,并把它添加本身:
List<C> list = new List<C>();
public class C
{
public C(List<C> list)
{
list.Add(this);
}
}
如果您将其设置为静态,您可以在不通过列表的情况下离开。
对这个问题的一种方法可能是这样的:
这将是不可能的“查找”特定类型的所有对象,你可以做的是建立和维护从一开始这个名单。你可以通过创建一个“工厂”方法来创建一个新的对象,将它添加到口头列表中,并返回它的引用。 “工厂”功能和列表可能(也许应该)是单身,取决于你将如何使用它。
你需要的是所谓的Factory Pattern。你使用一个类来构建你的课堂并跟踪构建的内容。
public class CFactory
{
public CFactory()
{
CreatedCBacking = new List<C>();
}
private List<C> CreatedCBacking;
public IList<C> CreatedC
{
get
{
return CreatedCBacking.AsReadonly();
}
}
public C NewC(String s, string t, bool b)
{
C temp = new C(s, t, b);
CreatedCBacking.Add(temp);
return temp;
}
}
public class C
{
public C(String s, string t, bool b)
{
//You class here
}
}
你用这个方式是这样的
public static void Main()
{
var factory = new CFactory();
var c1 = factory.NewC("string", "string", true);
var c2 = factory.NewC("string2", "string2", false);
foreach(var c in factory.CreatedC)
{
//loops over c1 and c2
}
}
Henk在他的回答中提到了同样的问题:只要它在这个列表中,没有'C'的实例就会被垃圾收集。 – 2013-02-19 07:13:22
@DanielHilgarth如果我在工厂使用单例或静态类,那将是真的。但是,因为您必须创建工厂实例,并且内部列表不是静态的,所以当工厂收集垃圾时,内部列表中的项目(如果释放所有其他参考)也是如此。 – 2013-02-19 07:34:34
当然。但那不是重点。这里你有一个全有或全无的场景。要么收集某个工厂实例创建的所有实例,要么没有。这可能甚至是OP想要的,所以它不一定是坏的。但我觉得应该明确指出,因此我的评论。 – 2013-02-19 07:37:42
什么有关走出去的范围(垃圾收集)的实例? – 2013-02-18 15:12:23
在构造上,将其添加到内部列表中 – 2013-02-18 15:13:10
我会将它添加到构造函数中,并在完成时将其从列表中移除或调用c#中的等效函数。 – dutt 2013-02-18 15:13:30