我想使用单例模式创建一个存储所有需要图片的缓冲区。
类似的东西:
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”方法是返回图片的副本还是返回引用?
应用程序需要一些图片,这些图片经常在不同的应用程序/表单上显示。因此,最好只引用图片而不是复制它们。
你知道怎么做吗?
答案 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;