关于C# 委托delegate的问题请教!

自学的时候看到很多关于委托方法的文章,但是始终不明白,代码可以写的简单一些,为什么有的却要写的很复杂!想咨询一下,复杂写的优点是什么?
网上的代码示例
public partial class Form2 : Form
    {
        Thread myThread;
        private delegate void MyDelegateUI();//定义委托
        private MyDelegateUI myDelegate;//声明委托
        
        public Form2()
        {
            InitializeComponent();
            myThread = new Thread(doWork);
            myDelegate=new MyDelegateUI(refreshRichListBox);
        }

        private void refreshRichListBox()
        {
            richTextBox1.AppendText( "Hello Delegate \r");
        }

        private void doWork()
        { 
            for (int i = 0; i < 10; i++)
            { 
                Thread.Sleep(1000);
                this.richTextBox1.Invoke(myDelegate);
                Application.DoEvents();
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            myThread.Start();
        }
  }
}
以下是我认为简单的写法,比较清晰,

  public partial class Form2 : Form
    {
        Thread myThread;
        private delegate void MyDelegateUI(); //定义委托
        public Form2()
        {
            InitializeComponent(); 
        }
        private void refreshRichListBox()
        {
            richTextBox1.AppendText( "Hello Delegate \r");
        }

        private void doWork()
        { 
            for (int i = 0; i < 10; i++)
            {
                this.richTextBox1.Invoke(new MyDelegateUI(refreshRichListBox));
                Thread.Sleep(1000); 
                Application.DoEvents();
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            myThread = new Thread(doWork);
            myThread.Start();
        }
  }
}
请指点一下,我第二种写法有什么弊端吗?

你现在就在执行委托啊,你不会或者不明白,所以委托我们来解释
这就是他的用处啊,不是说要故意复杂。
而是要么是为了统一,要么就是这里我真不会,委托给调用方确定

1.为了统一,比如Array.Sort,我要编写数组排序,排序算法我可以统一下来使用快排,但是比较方法你可以在外部定义,因为比较方法是变的,排序方法是不变的。不变的可以统一抽象,变的就让他变去
2.我真不会,比如比较一只狗和一只喵,谁更会游泳,这我真不会。排序我会,假设你告诉我A喵10秒,B狗15秒,C喵9秒,你让我告诉你他们谁快我会,但是在你不告诉我的情况下,我真不知道一只喵和一只狗要比较啥,所以这种比较方法我委托你外面,外面来告诉我这两怎么比较

这个是通用的委托定义和描述

至于你这个例子是个Winform的特殊例子---使用委托是因为权限不够,所以委托给权限够的执行
winform ui是单线程套间,如果是个非UI线程的想执行对UI的更新,他的权限不够
所以用invoke这个方法获得权限后委托执行(实际上是invoke将这个执行请求发到主线程消息泵里同步)

至于你纠结的多一条语句少一条语句,我们说不必这样研究代码

我能说,俺们大多数程序代码连你说定义都不定义么,我们直接使用匿名委托的

this.Invoke(new Action(() =>
            {
                this.dataGridView1.DataSource = new DataTable();
            }));


那么这种代码有该如何解释呢,有啥同和不同。这种就不需要解释了,你当通假字好了,没区别

委托是多态的一种实现
不是写的很复杂 这种东西是自己写的很爽 别人看的很不爽
第二种写法也没啥问题 这种乐意咋写咋写

很明显,你写的是每循环一次执行一次新的委托,而上面写的是先定义委托,每次都调同一个,从执行效率上讲没啥区别,因为不管是你写的还是他写的,最终委托都是在richTextBox1同线程上执行的,也就是虽然是线程,但是还是有阻塞的。
简单的讲,他的委托只有一个实例,但是你的有10个,开销上,你的稍微大点。

委托可以理解成js里面的回调,可以把委托作为一个参数传递