- 浏览: 1536650 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
有这样一道 .Net/C# 面试题:
请以事件的概念实现: 控制台屏幕录入任意字符串,并回显 "你键入了:" + 你刚才键入的字符串,如果键入 "q",退出程序,运行结束!
.Net 的 delegate 与 event 的实现是不可分的!属于基础知识!
写惯了 Windows 下的事件响应程序,真正从头到尾实现事件不常见!
我有两篇老文章:
《C# 写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!》
http://www.csdn.net/Develop/read_article.asp?id=19254
http://blog.csdn.net/playyuer/archive/2003/07/03/2856.aspx
《TreeView 的派生类: TreeViewEx 实现 NodeShowToolTip、NodeDoubleClick 事件》
http://www.csdn.net/Develop/Read_Article.asp?Id=19246
http://blog.csdn.net/playyuer/archive/2003/06/26/2857.aspx
也只是在 WinForm 下部分的实现了事件!
我的最简单的参考答案,都是用 static 方法实现的:
请以事件的概念实现: 控制台屏幕录入任意字符串,并回显 "你键入了:" + 你刚才键入的字符串,如果键入 "q",退出程序,运行结束!
.Net 的 delegate 与 event 的实现是不可分的!属于基础知识!
写惯了 Windows 下的事件响应程序,真正从头到尾实现事件不常见!
我有两篇老文章:
《C# 写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!》
http://www.csdn.net/Develop/read_article.asp?id=19254
http://blog.csdn.net/playyuer/archive/2003/07/03/2856.aspx
《TreeView 的派生类: TreeViewEx 实现 NodeShowToolTip、NodeDoubleClick 事件》
http://www.csdn.net/Develop/Read_Article.asp?Id=19246
http://blog.csdn.net/playyuer/archive/2003/06/26/2857.aspx
也只是在 WinForm 下部分的实现了事件!
我的最简单的参考答案,都是用 static 方法实现的:
class
Class1
{
public delegate void FireEventHandler( string s);
public static event FireEventHandler FireStatic;
static bool b = false ;
static void Main( string [] args)
{
FireStatic += new FireEventHandler(Fire1);
System.Console.WriteLine( " 请键入任意字符(串),\ " q\ " 退出! " );
string s;
while ( true )
{
s = System.Console.ReadLine();
FireStatic(s);
if (b == true )
break ;
}
}
static void Fire1( string s)
{
if (s != " q " )
{
System.Console.WriteLine( " 你键入了: " + s);
}
else
{
System.Console.WriteLine( " 不送了! " );
b = true ;
}
}
}
{
public delegate void FireEventHandler( string s);
public static event FireEventHandler FireStatic;
static bool b = false ;
static void Main( string [] args)
{
FireStatic += new FireEventHandler(Fire1);
System.Console.WriteLine( " 请键入任意字符(串),\ " q\ " 退出! " );
string s;
while ( true )
{
s = System.Console.ReadLine();
FireStatic(s);
if (b == true )
break ;
}
}
static void Fire1( string s)
{
if (s != " q " )
{
System.Console.WriteLine( " 你键入了: " + s);
}
else
{
System.Console.WriteLine( " 不送了! " );
b = true ;
}
}
}
经常编写 WinForm 程序的人应该熟悉,我想应该还是有人()不知道具体怎样实现的事件!
这些人实际并不一定真知道:
this.button1.Click += new System.EventHandler(this.button1_Click)
的 EventHandler
到底是怎么实现的?不过这确实不妨碍编写 Click 事件的响应代码!
今天我也复习了一下,提炼出 C# Console
程序跟大家分享一下:
请一定要注意程序注释,运行时注意屏幕提示:
//
请存为任意 *.cs 文件后,csc 成 exe 文件!
class Class1
{
// 声明一个委托 delegate FireEventHandler,delegate 没有 静态或实例 成员的说法
public delegate void FireEventHandler( string s);
// 声明 FireEventHandler 委托类型的事件
// 亦即将 FireEventHandler 理解为数据类型,易理解
public event FireEventHandler FireInstance;
public static event FireEventHandler FireStatic;
static void Main( string [] args)
{
System.Console.WriteLine( " Hello World " );
// 用 delegate: FireEventHandler() 委托,建立委托关系
// Static 方法 FireStatic() 代理(被委托)了 Static 方法 Fire1()
FireStatic += new FireEventHandler(Fire1);
// Static 方法 FireStatic() 代理(被委托)了 Instance 方法 .Fire2()
FireStatic = FireStatic + new FireEventHandler( new Class1().Fire2);
Class1 c = new Class1();
// Instance 方法 .FireInstance() 代理(被委托)了 Instance 方法 .Fire2()
c.FireInstance += new FireEventHandler(c.Fire2);
// Instance 方法 .FireInstance() 代理(被委托)了 Static 方法 Fire1()
c.FireInstance = new FireEventHandler(Fire1) + c.FireInstance;
// 以上仅是声明了委托关系,尚未执行 委托代理方法 !
System.Console.WriteLine( " 下面列印委托关系: " );
System.Console.WriteLine( " Static 方法 FireStatic() 作为代理接受以下委托: " );
ListDelegateRelation(FireStatic);
System.Console.WriteLine();
System.Console.WriteLine( " Instance 方法 .FireInstance() 作为代理接受以下委托: " );
ListDelegateRelation(c.FireInstance);
System.Console.WriteLine( " 请键入任意字符(串),\ " q\ " 退出! " );
string s;
while ( true )
{
s = System.Console.ReadLine();
System.Console.WriteLine( " -------------------------- " );
System.Console.WriteLine( " 以下是键入 \ " { 0 } \ " 后,触发事件的响应: " );
// 我们在此编程,即:在接受屏幕行录入后,令程序执行委托代理方法!
// 从而触发了事件!
// FireStatic 静态事件被触发了
FireStatic( " FireStatic 静态事件被触发了:\nStatic 方法 FireStatic() 受委托代理执行了 {0}\n你键入了: [ " + s + " ]\n " );
// .FireInstance 实例事件被触发了
c.FireInstance( " .FireInstance 实例事件被触发了: \nInstance 方法 .FireInstance() 受委托代理执行了 {0}\n你键入了: [ " + s + " ]\n " );
System.Console.WriteLine( " ======================================= " );
System.Console.WriteLine( " 请键入任意字符(串),\ " q\ " 退出! " );
if (s == " q " )
break ;
}
/**/ /// *
// 解除委托关系可用 "-="
// 下面解除委托,列印剩余委托关系
ListDelegateRelation(FireStatic);
FireStatic -= new FireEventHandler(Fire1);
ListDelegateRelation(FireStatic);
FireStatic = FireStatic - new FireEventHandler( new Class1().Fire2);
ListDelegateRelation(FireStatic);
c.FireInstance = new FireEventHandler(Fire1) - c.FireInstance;
ListDelegateRelation(c.FireInstance);
c.FireInstance = c.FireInstance - new FireEventHandler(Fire1);
ListDelegateRelation(c.FireInstance);
}
// 静态方法
static void Fire1( string s)
{
// 响应事件的程序
System.Console.WriteLine(s.Replace( " {0} " , " static 方法 Fire1() " ));
}
// 实例方法
void Fire2( string s)
{
// 响应事件的程序
System.Console.WriteLine(s.Replace( " {0} " , " Instance 方法 .Fire2() " ));
}
static void ListDelegateRelation(FireEventHandler x)
{
if (x != null )
{
// foreach (System.Delegate d in x.GetInvocationList())
foreach (FireEventHandler d in x.GetInvocationList())
{
System.Console.WriteLine(x.ToString() + " 类型的事件代理了 " + (d.Method.IsStatic ? x.Target + " 类的 Static 方法 " :d.Target + " 的 Instance 方法 . " ) + d.Method.Name);
}
}
else
{
System.Console.WriteLine( " 没有任何委托关系 " );
}
}
}
class Class1
{
// 声明一个委托 delegate FireEventHandler,delegate 没有 静态或实例 成员的说法
public delegate void FireEventHandler( string s);
// 声明 FireEventHandler 委托类型的事件
// 亦即将 FireEventHandler 理解为数据类型,易理解
public event FireEventHandler FireInstance;
public static event FireEventHandler FireStatic;
static void Main( string [] args)
{
System.Console.WriteLine( " Hello World " );
// 用 delegate: FireEventHandler() 委托,建立委托关系
// Static 方法 FireStatic() 代理(被委托)了 Static 方法 Fire1()
FireStatic += new FireEventHandler(Fire1);
// Static 方法 FireStatic() 代理(被委托)了 Instance 方法 .Fire2()
FireStatic = FireStatic + new FireEventHandler( new Class1().Fire2);
Class1 c = new Class1();
// Instance 方法 .FireInstance() 代理(被委托)了 Instance 方法 .Fire2()
c.FireInstance += new FireEventHandler(c.Fire2);
// Instance 方法 .FireInstance() 代理(被委托)了 Static 方法 Fire1()
c.FireInstance = new FireEventHandler(Fire1) + c.FireInstance;
// 以上仅是声明了委托关系,尚未执行 委托代理方法 !
System.Console.WriteLine( " 下面列印委托关系: " );
System.Console.WriteLine( " Static 方法 FireStatic() 作为代理接受以下委托: " );
ListDelegateRelation(FireStatic);
System.Console.WriteLine();
System.Console.WriteLine( " Instance 方法 .FireInstance() 作为代理接受以下委托: " );
ListDelegateRelation(c.FireInstance);
System.Console.WriteLine( " 请键入任意字符(串),\ " q\ " 退出! " );
string s;
while ( true )
{
s = System.Console.ReadLine();
System.Console.WriteLine( " -------------------------- " );
System.Console.WriteLine( " 以下是键入 \ " { 0 } \ " 后,触发事件的响应: " );
// 我们在此编程,即:在接受屏幕行录入后,令程序执行委托代理方法!
// 从而触发了事件!
// FireStatic 静态事件被触发了
FireStatic( " FireStatic 静态事件被触发了:\nStatic 方法 FireStatic() 受委托代理执行了 {0}\n你键入了: [ " + s + " ]\n " );
// .FireInstance 实例事件被触发了
c.FireInstance( " .FireInstance 实例事件被触发了: \nInstance 方法 .FireInstance() 受委托代理执行了 {0}\n你键入了: [ " + s + " ]\n " );
System.Console.WriteLine( " ======================================= " );
System.Console.WriteLine( " 请键入任意字符(串),\ " q\ " 退出! " );
if (s == " q " )
break ;
}
/**/ /// *
// 解除委托关系可用 "-="
// 下面解除委托,列印剩余委托关系
ListDelegateRelation(FireStatic);
FireStatic -= new FireEventHandler(Fire1);
ListDelegateRelation(FireStatic);
FireStatic = FireStatic - new FireEventHandler( new Class1().Fire2);
ListDelegateRelation(FireStatic);
c.FireInstance = new FireEventHandler(Fire1) - c.FireInstance;
ListDelegateRelation(c.FireInstance);
c.FireInstance = c.FireInstance - new FireEventHandler(Fire1);
ListDelegateRelation(c.FireInstance);
}
// 静态方法
static void Fire1( string s)
{
// 响应事件的程序
System.Console.WriteLine(s.Replace( " {0} " , " static 方法 Fire1() " ));
}
// 实例方法
void Fire2( string s)
{
// 响应事件的程序
System.Console.WriteLine(s.Replace( " {0} " , " Instance 方法 .Fire2() " ));
}
static void ListDelegateRelation(FireEventHandler x)
{
if (x != null )
{
// foreach (System.Delegate d in x.GetInvocationList())
foreach (FireEventHandler d in x.GetInvocationList())
{
System.Console.WriteLine(x.ToString() + " 类型的事件代理了 " + (d.Method.IsStatic ? x.Target + " 类的 Static 方法 " :d.Target + " 的 Instance 方法 . " ) + d.Method.Name);
}
}
else
{
System.Console.WriteLine( " 没有任何委托关系 " );
}
}
}
下面是一个更复杂点的 Console 程序,根据 输入数字的奇偶性触发不同的事件!
using
System.Text.RegularExpressions;
class Class1
{
private static Class1 x;
static void Main( string [] args)
{
System.Console.WriteLine( " Hello World " );
x = new Class1();
// 设置委托 delegate 关系
// 把 += 右边的 委托 给左边 的 (-= 是取消委托关系)
// 以后就可以用对"左边"的方法签名的调用,实际就是相当于调用了"右边"的方法的执行
// 将 Class1 的实例方法(x.Fire1) 委托给 Class1 的实例事件(x.FireInstance)
x.FireInstance += new Class1.FireEventHandler(x.Fire1);
// 将 Class1 的静态方法(Class1.Fire2) 委托给 Class1 的实例事件(x.FireInstance)
x.FireInstance += new Class1.FireEventHandler(Class1.Fire2);
// 将 Class1 的静态方法(Class1.Fire2) 委托给 Class1 的静态事件(Class1.FireStatic)
Class1.FireStatic += new Class1.FireEventHandler(Class1.Fire3);
// 将 Class1 的实例方法(x.Fire1) 委托给 Class1 的静态事件(Class1.FireStatic)
Class1.FireStatic += new Class1.FireEventHandler(x.Fire4);
int i;
string s;
while ( true )
{
if ((s = System.Console.ReadLine()) == " q " )
{
break ;
}
if (Regex.IsMatch(s, @" ^\d+$ " ))
{
i = System.Convert.ToInt32(s);
if (i % 2 == 0 )
{
// 输入时偶数触发该事件
x.OnFireInstance(); // 调用实例方法触发事件
}
else
{
// 输入时基数触发该事件
Class1.OnFireStatic(); // 调用静态方法触发事件
}
}
}
}
public string Fire1() // 实例方法
{
System.Console.WriteLine( " 输入是偶数 " );
return null ;
}
public static string Fire2() // 静态方法
{
System.Console.WriteLine( " 输入是偶数 " );
return <span s
class Class1
{
private static Class1 x;
static void Main( string [] args)
{
System.Console.WriteLine( " Hello World " );
x = new Class1();
// 设置委托 delegate 关系
// 把 += 右边的 委托 给左边 的 (-= 是取消委托关系)
// 以后就可以用对"左边"的方法签名的调用,实际就是相当于调用了"右边"的方法的执行
// 将 Class1 的实例方法(x.Fire1) 委托给 Class1 的实例事件(x.FireInstance)
x.FireInstance += new Class1.FireEventHandler(x.Fire1);
// 将 Class1 的静态方法(Class1.Fire2) 委托给 Class1 的实例事件(x.FireInstance)
x.FireInstance += new Class1.FireEventHandler(Class1.Fire2);
// 将 Class1 的静态方法(Class1.Fire2) 委托给 Class1 的静态事件(Class1.FireStatic)
Class1.FireStatic += new Class1.FireEventHandler(Class1.Fire3);
// 将 Class1 的实例方法(x.Fire1) 委托给 Class1 的静态事件(Class1.FireStatic)
Class1.FireStatic += new Class1.FireEventHandler(x.Fire4);
int i;
string s;
while ( true )
{
if ((s = System.Console.ReadLine()) == " q " )
{
break ;
}
if (Regex.IsMatch(s, @" ^\d+$ " ))
{
i = System.Convert.ToInt32(s);
if (i % 2 == 0 )
{
// 输入时偶数触发该事件
x.OnFireInstance(); // 调用实例方法触发事件
}
else
{
// 输入时基数触发该事件
Class1.OnFireStatic(); // 调用静态方法触发事件
}
}
}
}
public string Fire1() // 实例方法
{
System.Console.WriteLine( " 输入是偶数 " );
return null ;
}
public static string Fire2() // 静态方法
{
System.Console.WriteLine( " 输入是偶数 " );
return <span s
发表评论
-
WPF/Silverlight深度解决方案:(六)HLSL自定义渲染特效之完美攻略(上)
2010-01-13 16:40 2375Shader Effect 中文名称为“渲染特效”或“滤镜” ... -
Silverlight Image Source URI : 一个反斜杠引发的血案
2010-01-12 13:10 3586Silverlight Image Source U ... -
SilverLight跨域访问及其常用的几种解决方法
2010-01-06 16:59 5435SilverLight 出于对安全性的考虑默认情况下对UR ... -
有关silverlight中调用webservice的问题!!
2010-01-06 15:07 3340System.InvalidOperationExceptio ... -
Server.UrlEncode、HttpUtility.UrlDecode不同编码
2010-01-06 12:39 3269Server.UrlEncode、HttpUtility.U ... -
LINQ to XML一些基本查询
2010-01-06 12:34 2039/**/ /// /根据元素的名称进行筛选(有命名空 ... -
使用LINQ to XML来查询XML
2010-01-06 12:16 2755使用LINQ to XML来查询XML ... -
给弟弟起步学习软件开发(.Net 方向)的指导,博友们帮助看看,提些意见给他。
2010-01-06 11:15 964在我学习的时候走了至少3年的弯路,那个时候没有人告诉我该如 ... -
LINQ to XML 用 LINQ 查询 XML
2010-01-06 11:15 1510LINQ to XML 用 LINQ 查询 XML ... -
一个实例掌握linq to XML增查删改
2010-01-06 11:10 2250最近忽然想把过去写的I ... -
使用XML LINQ查询和转换XML
2010-01-06 10:37 1497本章包括 n XML LI ... -
XML LINQ简介
2010-01-06 10:32 1564本章包括 n XML LINQ ... -
.Net 中string与byte[]相互转换
2010-01-05 16:43 2428public static byt ... -
正则表达式收集(持久更新)
2010-01-04 15:56 1116正则表达式收集( ... -
网上搜集的webbrower的资料,很有借鉴价值
2010-01-04 15:54 1896http://hi.baidu.com/lovemoe/ ... -
Lexware Assembly Reference Tool for Visual Studio 2005 / 2008
2010-01-04 10:35 1885http://www.codeproject.com/KB/m ... -
Visual Studio的 诡异bug(mscorlib无法引用)
2010-01-04 09:27 2520这个需要手动修改项目的配置文件 添加 <Re ... -
[C#实战]Google Map开发实战参考
2010-01-03 16:48 5775[C# 实战] ... -
ADO.NET Entity Framework简介
2009-12-21 18:46 2696下一代的ADO.NET的目标是要解决关系数据模型和实际应用程序 ...
相关推荐
### .NET中的委托与事件详解 #### 一、委托的简介与使用 ##### 1. 委托的声明 委托是一种数据类型,用于封装具有相同签名的方法。它允许我们将方法作为参数传递,并且可以在运行时调用这些方法。委托声明的一般...
最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....
.NET框架中的委托和事件是两种核心的编程概念,它们在构建可扩展、反应式和异步应用程序时起着至关重要的作用。本文将深入探讨.NET委托和事件,以及它们如何在实际应用中发挥作用。 首先,我们需要了解什么是委托。...
在ASP.NET中,委托和事件是两个关键概念,它们是实现组件间通信和响应用户交互的重要机制。 **委托(Delegate)** 委托在.NET Framework中扮演着函数指针的角色,允许我们传递方法作为参数或者存储方法以便稍后调用...
在.NET框架中,委托是类型安全的函数指针,它...如果你已经掌握了这些基础知识,尝试将它们应用到实际项目中,你会发现委托是.NET编程中不可或缺的一部分。祝你在编程旅程中取得更多成就,如果还有疑问,欢迎继续交流。
在.NET Framework中,委托(Delegate)和事件(Event)是非常重要的概念。对于初学者而言,这些概念可能较为抽象和难以理解。本文旨在通过一系列逐步深入的例子来帮助读者更好地掌握委托与事件的基本原理及其在.NET ...
### C#.NET中的委托和事件 #### 委托 在C#.NET中,委托是一种引用类型的数据结构,它封装了方法的引用。通过委托,我们可以将方法作为参数进行传递,或者将方法作为对象属性存储起来。这为C#.NET中的事件处理、回...
根据提供的信息,我们可以深入探讨.NET委托(Delegate)的相关概念及其在C#中的应用。下面将详细解释委托的基本概念、用途以及如何在实际编程场景中使用它们。 ### 委托的基本概念 在.NET框架中,委托是一种引用...
在.NET框架中,C#语言提供了委托(Delegate)这一特性,它是类型安全的函数指针,可以用来封装方法。委托允许我们将方法作为参数传递给其他方法,或者存储在一个变量中以便稍后调用,这在处理事件时尤其有用。本教程...
在.NET Framework中,事件模型基于委托(Delegate)和事件(Event)。委托是类型安全的函数指针,它允许我们将方法作为参数传递给其他方法。事件是对象公开的一种通知机制,当特定条件满足或状态改变时,对象会触发...
根据提供的文件信息,可以看出文档与 .NET 和 C# 动态添加事件(Event)有关,但实际内容似乎并不涉及具体的编程细节,而是包含了大量看似不相关的符号和文本。因此,这里将基于标题和描述来详细阐述如何在 .NET 的 ...
在C#编程语言中,事件和委托是两个关键概念,它们是实现对象间通信和响应机制的核心工具。本文将深入探讨这两个概念,并提供详细的解释。 首先,我们要理解什么是委托(Delegate)。委托在C#中是一种类型,它代表了...
.NET Framework中的委托和事件是C#编程中两个关键的概念,它们在实现事件驱动编程和回调机制方面发挥着重要作用。委托可以被理解为一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在一个...
.NET C# 中的委托(Delegate)和事件是编程中的核心概念,它们对于理解和编写高效、模块化的代码至关重要,特别是对于初学者来说。委托是 C# 中的一种类型,它允许我们存储对方法的引用,就像对象引用类实例一样。...
[主要用delegate&event实现。代码很简单,本来想写注释了,可碍于嘴拙,便摆了个空架子,朋友们可以自己酌情添加] 第一题:一个Page:PageA.aspx的网页上放有一个TextBox ID为TextBox1和一个Button ID为Button1; ...
以下是事件委托实现的基本步骤: 1. **定义委托类型**:创建一个委托类型,声明它接受的参数和返回类型。在本例中,可能有一个`ProgressChanged`委托,接受一个整数参数,表示进度值。 ```csharp public delegate ...
在.NET框架中,C#语言提供了丰富的特性来帮助开发者创建高效、可复用的代码,其中泛型和事件委托是两个关键概念。泛型能够提供类型安全的数据结构,而事件委托则是实现对象间通信的重要机制。当我们把两者结合起来,...
.NET之美在于其强大的抽象能力和丰富的编程模型,其中委托(Delegate)是.NET框架中一个至关重要的概念,它在事件处理和回调机制中起着核心作用。本文将深入探讨.NET中的委托,帮助你理解其原理和应用。 委托在.NET...