程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 為何不能在子類或外部發布C#事件

為何不能在子類或外部發布C#事件

編輯:關於C#

背景

一個朋友問了一個問題:“為什麼不能在子類或外部發布C#事件?”,我說我不知道,要看看生產的IL代碼,下面我們看看。

測試代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
    
namespace EventStudy
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    
    class Base
    {
        private Action _testEventB;
    
        public event Action TestEventA;
    
        public event Action TestEventB
        {
            add
            {
                _testEventB += value;
            }
            remove
            {
                _testEventB -= value;
            }
        }
    
        protected void OnTestEventA()
        {
            var testEventA = this.TestEventA;
    
            testEventA();
        }
    
        protected void OnTestEventB()
        {
            var testEventB = _testEventB;
    
            testEventB();
        }
    }
    
    class Child : Base
    {
        public void Do()
        {
            //this.TestEventA();不能這樣訪問
        }
    }
}

IL

分析

1、TestEventA和TestEventB最終生成的代碼結構基本一樣,可以知道C#編譯器幫我們做了一些工作。

2、其實C#編譯器應該可以做到允許我們直接調用的,比如:生成的字段為protected類型,考慮到封裝性,編譯器沒這麼做,我覺得是合理的。

一則笑話

一位老先生問我如何拷貝文件,我說Control+C,然後Control+V,第二天他告訴我不行,後來發現他是在公司Control+C,回到家裡Control+V的。

今天發生了真人版的這個事情,一位非常有前途的兄弟,在一個基類裡定義了一個Event,有兩個子類,分別為A和B,在A的實例裡發布Event,在B的實例裡監聽這個Event。

一個問題

為什麼一定要這麼發布事件(引入一個局部變量):

protected void OnTestEventA()
        {
            var testEventA = this.TestEventA;
    
            testEventA();
        }

背景

找個機會得看看一些C#本質之類的書了,很多概念我也不是很清楚!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved