2013-02-18 51 views
-1

我在c#中有一个类,名为C.当我执行程序时,我创建了这个类的新对象。在某些时候,我需要创建一个列表List<C> listC = new List();,我将所有创建的对象放在这里。 当然,我可以在创建这个对象后使用list.Add为每个对象添加。但由于某些原因难以解释,我宁愿将所有曾经创建过thiiss类的对象添加到列表中。把一个类的所有对象放在列表中

这是不是有可能?我不确定是否有解决方案:-)。

在此先感谢所有回答问题的人。

+1

什么有关走出去的范围(垃圾收集)的实例? – 2013-02-18 15:12:23

+0

在构造上,将其添加到内部列表中 – 2013-02-18 15:13:10

+0

我会将它添加到构造函数中,并在完成时将其从列表中移除或调用c#中的等效函数。 – dutt 2013-02-18 15:13:30

回答

0

当您创建对象,例如你可以只直接添加到列表:

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); 
    } 

} 

如果您将其设置为静态,您可以在不通过列表的情况下离开。

0

对这个问题的一种方法可能是这样的:
这将是不可能的“查找”特定类型的所有对象,你可以做的是建立和维护从一开始这个名单。你可以通过创建一个“工厂”方法来创建一个新的对象,将它添加到口头列表中,并返回它的引用。 “工厂”功能和列表可能(也许应该)是单身,取决于你将如何使用它。

2

你需要的是所谓的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 
    } 
} 
+0

Henk在他的回答中提到了同样的问题:只要它在这个列表中,没有'C'的实例就会被垃圾收集。 – 2013-02-19 07:13:22

+0

@DanielHilgarth如果我在工厂使用单例或静态类,那将是真的。但是,因为您必须创建工厂实例,并且内部列表不是静态的,所以当工厂收集垃圾时,内部列表中的项目(如果释放所有其他参考)也是如此。 – 2013-02-19 07:34:34

+0

当然。但那不是重点。这里你有一个全有或全无的场景。要么收集某个工厂实例创建的所有实例,要么没有。这可能甚至是OP想要的,所以它不一定是坏的。但我觉得应该明确指出,因此我的评论。 – 2013-02-19 07:37:42

相关问题