C#事件演示程序3)——体会事件更本质的东西

本文通过两个示例探讨了C#中的事件机制,包括事件处理函数的定义方式、静态与非静态方法作为事件处理函数的区别等。作者针对事件机制中的几个常见疑问进行了深入研究,并给出了清晰的解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在上篇 文章中对事件的分析还是比较片面的。这是昨天晚上回家又仔细研究了一下才发现的。
因为我本来就觉得有些地方还是没弄清楚。比如事件的代理一定是EventHandler或派生类吗?签名必须有参数吗?某个类对事件的注册只能写在类的内部构造函数中吗?不能写在外部吗?其事件处理函数只能是非静态的吗?不能是静态的吗?昨天本以为对事件有了比较全面的认识了,但似乎总觉得哪里不对劲,或者似乎对事件的理解非常死板,思路自己都觉得僵化的很。隐隐带着这些疑问,又参考了一下《C#完全手册》,这些问题迎刃而解。
下面是我写的例子:
A)
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication4
{
    
public class Program
    
{
        
static void Main(string[] args)
        
{
            MyEvent myEventIns 
= MyEvent.Instance;
            
            MyListener Listener 
= new MyListener();
            myEventIns.myEvent 
+= new MyDelegate(Listener.DisplayString);
            
            myEventIns.OnMyEvent();

        }

    }


    
public class MyListener
    
{
        
public MyListener()
        
{
        }

        
public void DisplayString()
        
{
            Console.WriteLine(
"hello!Welcome to my blog!");
        }

    }


    
public delegate void MyDelegate();
    
public class MyEvent
    
{
        
private static MyEvent _instance = new MyEvent();
        
public static MyEvent Instance
        
{
            
get return _instance; }
        }

        
private MyEvent()
        
{
        }

        
public event MyDelegate myEvent;

        
public void OnMyEvent()
        
{
            RaiseMyEvent();
        }

        
private void RaiseMyEvent()
        
{
            
if (myEvent != null)
            
{
                myEvent();
            }

        }

    }

}

B)把事件处理方法改成静态的:
 
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication4
{
    
public class Program
    
{
        
static void Main(string[] args)
        
{
            MyEvent myEventIns 
= MyEvent.Instance;
            
//Listener Listener = new Listener();
            myEventIns.myEvent += new MyDelegate(Listener.DisplayString);
            myEventIns.OnMyEvent();

        }

    }


    
public class Listener
    
{
        
//public Listener()
        
//{
        
//    MyEvent.Instance.myEvent += new MyDelegate(DisplayString);
        
//}
        
//public void DisplayString()
        
//{
        
//    Console.WriteLine("hello!Welcome to my blog!");
        
//}
        public static void DisplayString()
        
{
            Console.WriteLine(
"hello!Welcome to my blog!");
        }

    }


    
public delegate void MyDelegate();
    
public class MyEvent
    
{
        
private static MyEvent _instance = new MyEvent();
        
public static MyEvent Instance
        
{
            
get return _instance; }
        }

        
private MyEvent()
        
{
        }

        
public event MyDelegate myEvent;

        
public void OnMyEvent()
        
{
            RaiseMyEvent();
        }

        
private void RaiseMyEvent()
        
{
            
if (myEvent != null)
            
{
                myEvent();
            }

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值