如何阅读这C#委托代码

来源:百度知道 编辑:UC知道 时间:2024/09/23 00:26:43
线程道理很简单但这代码却弄得很不知所以然
(问题在注释栏内)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Doris.CSharpBook
{
public delegate void DelegateClass();
public class Starter
{
public static void Main(string[] args)
{
DelegateClass del = MethodA;
DelegateStateBag state = new DelegateStateBag();//注意此行和static void Callback(IAsyncResult)
//都有state。为何这两个state不会重名?
IAsyncResult ar = del.BeginInvoke(Callback, state);//BeginInvoke似乎要一个AsyncCallback类型,
//为何void类型的Callback能符合呢?
if (ar.IsCompleted == true)
{
Console.WriteLine("MethodA completed ");
}
else
{
Console.WriteLine("MethodA not completed");

//都有state。为何这两个state不会重名?
一个是表示静态方法是static一个实例名state,怎么会重名呢?

//为何void类型的Callback能符合呢?
AsyncCallback的签名如下
[SerializableAttribute]
[ComVisibleAttribute(true)]
public delegate void AsyncCallback(
IAsyncResult ar
)

可以用它来表示所有返回值为void类型,输入参数为IAsyncResult的方法,你给的那个Callback就是满足这个条件的。所以,正好符合啊

DelegateStateBag state = new DelegateStateBag()

是声明了一个state
DelegateStateBag state = (DelegateStateBag)ar.AsyncState

是实例化state (即将AsyncState附给state) 这两个是一个state 所以不会重名。

del 是个委托,void意思是无返回值类型,也可以认为是返回所有的返回值类型。