旭日暖阳思密达 2022-08-04 16:21 采纳率: 100%
浏览 40
已结题

关于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();
        }
  }
}
请指点一下,我第二种写法有什么弊端吗?
  • 写回答

4条回答 默认 最新

  • wanghui0380 2022-08-05 08:36
    关注

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

    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();
                }));
    
    
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月14日
  • 已采纳回答 8月6日
  • 创建了问题 8月4日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效