我有一个winform
构造函数,其参数为:
public SnippingTool(Bitmap screenShot)
{
InitializeComponent();
this.BackgroundImage = screenShot;
...
}
当app正在运行时,我只需要winform
的一个实例,所以我决定使用单例模式。
我发现了这种结构(由于我的类构造函数中的参数,它不合适):</ p>
private static SnippingTool instance;
public static SnippingTool GetInstance
{
get
{
if (instance == null)
{
instance = new SnippingTool();
}
return instance;
}
}
如何通过单例传递参数?
答案 0 :(得分:1)
如果Bitmap每次都不同,并且你肯定只想要一个SnippingTool
,那么Bitmap甚至可能都没有该工具的实例变量,那么Bitmap在构造函数中肯定没有位置。
而是使Bitmap成为您在SnippingTool
实例上调用的主要“操作”方法的参数。
或者,如果您需要SnippingTool
将位图作为“状态”(因为它是一个表单,并且需要显示和编辑图像),那么创建SetImage(Bitmap b)
等方法,ClearImage()
等。
答案 1 :(得分:0)
private static SnippingTool instance;
public static SnippingTool GetInstance(Bitmap screenShot)
{
if (instance == null || instance.IsDisposed)
{
instance = new SnippingTool();
}
instance.SetBitmap(screenShot); // if you need otherwise pass it to constructor
return instance;
}
答案 2 :(得分:0)
您也可以创建方法而不是属性。
private static SnippingTool _instance;
public static SnippingTool GetInstance(Bitmap screen)
{
get
{
if (_instance == null || _instance.IsDisposed)
{
_instance = new SnippingTool(screen);
}
return _instance;
}
}
答案 3 :(得分:0)
试试这个
private static SnippingTool instance;
private SnippingTool (var par){
....
}
public SnippingTool createSingleton(var par){
if instance != null
return instance;
else
return new SnippingTool(par);
}
答案 4 :(得分:0)
如果此SnippingTool
只能与一个BitMap
实例一起使用,则没有理由始终将one传递给singleton属性/方法。这至少会让人感到困惑,因为调用者会认为他会得到这个位图的工具。如果传递不同的实例,该方法应抛出异常。但这是否有意义,在我看来并不多。
所以我会这样做,实施SetScreenshot
或SetInstance
方法,例如:
public class SnippingTool
{
private SnippingTool(Bitmap screenShot)
{
this.ScreenShot = screenShot;
}
private static SnippingTool instance;
public static void SetScreenshot(Bitmap screenShot)
{
if (instance == null || instance.IsDisposed)
{
instance = new SnippingTool(screenShot);
}
else
{
// now your logic, is it allowed then overwrite the screenShot, otherwise:
throw new ArgumentException("It's not allowed to change the screenShot for this SnippingTool", nameof(screenShot));
}
}
public static SnippingTool GetInstance
{
get
{
if (instance == null)
throw new Exception("The SnippingTool needs a screenShot first, use first " + nameof(SetScreenshot));
return instance;
}
}
public Bitmap ScreenShot { get; }
// ...
}