委托是一个对象,它知道如何调用一个方法。
委托的定义:委托类型定义了委托实例可以调用的那类方法,具体来说,委托类型定义了方法的返回类型和参数。
delegate string Hello(string name);
string Splicing(string name){ return $"hello,{ name }."; }
Hello hello =
Splicing;
string resultName = hello("bob");//输出 hello bob
所有的委托实例都具有多播的能力。一个委托实例可以引用一组目标方法。
引用一组方法的示例:
DemoDelegate dd -=
DemoMethond1;
相当于
dd = DemoMethond1;
实例方法目标和静态方法目标
public
delegate
void
Reporter
(
int
result
);
public
class
A
{
public
void
AReporter
(
int
result
)
{
Console
.
WriteLine
(
result
);
}
}
public
class
Program
{
static
void
Main
()
{
A a
=
new
A
();
Reporter
r
=
x
.
AReporter
;
r
(
50
);
Console
.
WriteLine
(
r
.
Target
==
x
);
//True
Console
.
WriteLine
(
p
.
Method
);
//void AReporter(Int32)
}
}
public
delegate T Mydelegate<T>(T parameter);
Func和Action委托
//1.这里表示的是,只有一个带泛型T返回值类型的委托
delegate
TResult
Func<out
TResult>();
//2.这里表示的是,有一个带泛型T返回值类型和一个带泛型入参的委托(入参数量最多16个)
delegate
TResult
Func<in T,out
TResult>(T parameter);
//3.这里表示的是,一个无参无返回值类型的委托
delegate
void
Action();
//4.这里表示的是,一个入参无返回值类型的委托(入参数量最多16个)
delegate
TResult
Func<in T,out
TResult>(T parameter);
class A :
ICalculation
{
public
int
Calculation(int x)=> x*x;
}
class B :
ICalculation
{
public
int
Calculation(int x)=> x*x*x;
}
delegate
void
Demo1();
delegate
void
Demo2();
Demo1 d1 =
Method1;
Demo2 d2 = d1;// error
delegate
void
StringAction(string s);
class
Demo
{
static
void
Main()
{
StringAction sa =
new
StringAction(ActOnObject);
sa("hello");
}
static
void
ActOnObject(object o)=>Console.WriteLine(o);//hello
}
delegate
object
ObjectRetriever(string s);
class
Demo
{
static
void
Main()
{
ObjectRetriever o =
new
ObjectRetriever(RetrieverString);
object result = o();
Console.WriteLine(result);
}
static
string
RetrieverString()=>"hello";
}