C# 7.2부터 쓸 수 있다.
VS 2019 기본 설정으로는 못 쓴다.
예전 MSDN community에서는 그딴 게 왜 필요함? 이러고 있었는데
이럴 때 있으면 좋을 것 같지 않은가?
WndA ctrl1;
WndB ctrl2;
private void menuItem1_Click(object sender, EventArgs e)
{
if (ctrl1== null || ctrl1.IsDisposed)
{
ctrl1= new WndA();
ctrl1.Show();
}
else { ctrl1.BringToFront(); }
}
private void menuItem2_Click(object sender, EventArgs e)
{
if(ctrl2==null || ctrl2.IsDiposed)
{
ctrl2 = new WndB();
ctrl2.Show();
}
else { ctrl2.BringToFront(); }
}
public static void OpenSingletonWindow<T>(this ref T c) where T : Control, new()
{
if(c==null || c.IsDisposed) {c=new T(); c.Show();}
else { c.BringToFront(); }
}
Extension method는 null에서도 잘 실행되니까(virtual call이 아님: Stackoverflow)
Control c = null;
c.OpenSingletonWindow();
해도 잘 실행됐을 것이다(this ref가 가능했다면).
Extension method 없이 static class로 하면
SomeUglyStaticClassName.OpenSingletonWindow(ref ctrl);
이렇게 한다. 쓰고 보니 별 차이가 없긴 하다.
굳이 못하게 막아놓은 이유는 또 뭐람