使用变量值来检查特定实例是否存在,如果不存在 - 创建它

时间:2015-02-04 20:05:07

标签: c# class instance

我有一个像这样的图像列表:

public List<Image> imageList = new List<Image>();

我还有一个图片类,以便收集和操作列表中图像的数据:

public Class Pic {
    // properties and stuff
}

然后我有一个以整数作为参数的函数。该整数对应于图像列表中的图像。我想在函数中做的是检查是否为该特定图像创建了Pic类的实例。如果没有,我想创建它,使用传递给函数的变量的值。以下代码显然不起作用,但它显示了我想要的内容:

public void doStuffWithImage(int picNumber) {
    // Check if instance called pic + picNumber exists
    if(pic + picNumber.toString() == null) {
        // Create an instance
        Pic pic + picNumber.toString() = new Pic();
    }
}

关于如何实现这一目标的建议?

4 个答案:

答案 0 :(得分:1)

您似乎正在尝试创建单个变量pic1pic2等等。您最好使用字典:

Dictionary<int, Pic> pics = new Dictionary<int, Pic>();

public void doStuffWithImage(int picNumber) {
    // Check if instance called pic + picNumber exists
    if(!pics.ContainsKey(picNumber)) {
        // Create an instance
        pics[picNumber] = new Pic();
    }
}

答案 1 :(得分:0)

您需要创建一个&#34;注册表&#34;已知Pic的。 DIctionary<int,Pic>是保存此注册表的好集合。你需要将注册表本身存储在某个地方 - 也许是在&#34;工厂&#34;注册图片的对象。

class PicFactory {
    private readonly IDictionary<int,Pic> knownPics = new Dictionary<int,Pic>();
    public Pic GetOrCreate(int id) {
        Pic res;
        if (knownPics.TryGetValue(id, out res)) {
            return res;
        }
        res = new Pic(id.ToString()); // This assumes that Pic(string) exists
        knownPics.Add(id, res);
        return res;
    }
}

这种实现注册表的方式对于您的目的来说可能过于原始 - 例如,如果您需要注册表是并发的,则需要设置一些排序,如果锁定方案保护knownPics字典。访问图片的类需要创建PicFactory的实例,以便它可以通过GetOrCreate(id)调用访问图片。

答案 2 :(得分:0)

如果您使用.net 4.0或更多,则可以使用Lazy类型:

  

为延迟初始化提供支持。

这意味着对象将不是在声明的时刻构建,而是在第一次访问时构建。

所以你基本上可以声明它们像

List<Lazy<Pic>> ....

答案 3 :(得分:0)

请参阅Lazy<T>和一般的延迟加载模式 - 这实际上是一种常见的优化技术,因为它推迟了在启动时可以添加到运行时的微延迟的内容。

要小心确保微延迟是值得的,我建议留下哪些方法可以强行加载。

如果您从列表中抓取,请使用.Any.Contains检查前言,并且由于您正在按名称查找,请考虑使用而是Dictionary