C#Singleton用作图片缓冲区

时间:2013-12-11 09:11:15

标签: c# memory reference singleton

我想使用单例模式创建一个存储所有需要图片的缓冲区。

类似的东西:

public sealed class BaseBuffer
{
    private static readonly Dictionary<string, Bitmap> pictures = new Dictionary<string, Bitmap>();

    public static Bitmap GetPicture(string name, ref Bitmap output)
    {
        //In case the pictureBuffer does not contain the element already
        if (!pictures.ContainsKey(name))
        {
            //Try load picture from resources
            try
            {
                Bitmap bmp = new Bitmap(System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream("MyProject.Resources." + name + ".png"));
                pictures.Add(name, bmp);
                return bmp;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Picture {0} cannot be found.", name);
            }
        }
        else
        {
            return pictures[name];
        }

        return null;
    }

现在我不确定。 “GetPicture”方法是返回图片的副本还是返回引用?

应用程序需要一些图片,这些图片经常在不同的应用程序/表单上显示。因此,最好只引用图片而不是复制它们。

你知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

我不确定,但是我猜你应该做return bmp;而不是做output=bmp;等等。否则你可以摆脱参数。

我也认为,即使return bmp;等等也会返回引用,但不会返回存储在dict中的Bitmap的副本。所以无论哪种方式都没问题......

答案 1 :(得分:0)

它将返回对字典中保存的Bitmap(因为它被定义为类)的引用。所以不,它不会返回一个独特的副本。返回的位图的更改也将在字典中观察到,因为它们将是相同的底层对象。我不确定您使用ref Bitmap output做了什么,因为它似乎没有被使用。

此外,如果经常调用,字典上的TryGetValue会稍微好一点:

Bitmap bmp;

if (!pictures.TryGetValue(name, out bmp))
{
    bmp = new Bitmap(System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream("MyProject.Resources." + name + ".png"));
    pictures.Add(name, bmp);
}

return bmp;