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



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

이산수학? 그래프? 공무원 문제

문 17. 다음 글의 내용이 참일 때, 갑이 반드시 수강해야 할 과목은? 갑은 A~E 과목에 대해 수강신청을 준비하고 있다. 갑이 수강하기 위해 충족해야 하는 조건은 다음과 같다. ○ A를 수강하면 B를 수강하지 않고, B를 수강하지 않으면 C를 ...