Saturday, February 19, 2022

Extension Method에서 ref를 쓸 수 있는가?

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);
이렇게 한다. 쓰고 보니 별 차이가 없긴 하다.



굳이 못하게 막아놓은 이유는 또 뭐람

No comments:

Post a Comment

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...