代碼意思:dtEventHandler?.Invoke();
1.這是個什么語法,意思是啥?
2.為什么還無限回圈了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Threading;
using System.Reflection;
namespace ConsoleApplication1
{
public class Program
{
public delegate void dt();
public static event dt dtEventHandler;
static void Main(string[] args)
{
dtEventHandler += () =>
{
dtEventHandler?.Invoke();
};
new Program().RuntimeArgumentHandlse();
Console.ReadKey();
}
public void RuntimeArgumentHandlse()
{
dtEventHandler();
}
public static void Test()
{
Console.Write("I am a test");
}
}
}
uj5u.com熱心網友回復:
如果 dtEventHandler 委托內容不是空(MultiCast 委托鏈中沒有委托實體),則呼叫委托。一般來說,不要“自己監聽自己”的委托,而是直接呼叫該呼叫的方法。委托功能通常是作為“介面中的一部分”宣告,用來觸發事件去通知外部客戶的,此時外部客戶要呼叫什么目標方法并不知道,所以才用委托事件模式。
在你的代碼中,你自己 Invoke 事件(觸發事件),而自己監聽到這個事件時又去再 Invoke 事件,回圈不斷,沒有結束邏輯。
uj5u.com熱心網友回復:
當你“自己”想用方法 abc 來回應某個操作時,你應該寫public void RuntimeArgumentHandlse()
{
dtEventHandler?.Invoke();
}
來直接呼叫自己的方法。實際上“自己監聽自己觸發”是個很幼稚的事情。之所以定義 dtEventHandler 應該是為了區分不同工程,然后組織不同人不同時間點去開發和使用不同工程的需要。例如你打算讓將來使用你的模塊的 DLL 的人能實作 RuntimeArgumentHandlse 中的具體行為,才會觸發事件
public void RuntimeArgumentHandlse()
{
abc();
}
uj5u.com熱心網友回復:
當你“自己”想用方法 abc 來回應某個操作時,你應該寫public void RuntimeArgumentHandlse()
{
abc();
}
來直接呼叫自己的方法。實際上“自己監聽自己觸發”是個很幼稚的事情。之所以定義 dtEventHandler 應該是為了區分不同工程,然后組織不同人不同時間點去開發和使用不同工程的需要。例如你打算讓將來使用你的模塊的 DLL 的人能實作 RuntimeArgumentHandlse 中的具體行為,才會觸發事件
public void RuntimeArgumentHandlse()
{
dtEventHandler?.Invoke();
}
注意,除非你寫(單元)測驗用例,否則不要費力氣去“自己監聽自己的事件”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/168383.html
標籤:C#
