C#依頼、イベントとコールバック関数
9834 ワード
.Net , 。 ASP.NET WINFrom , (Load), (Paint), (Init) 。
“protected void Page_Load(object sender, EventArgs e)” 。 , “object sender, EventArgs e” 。 ?
、 ( )
? , , ASP.NET , JS , JS 。 , 。 ? ! , , 。
C# , : , 。 JS 。 , ( ), , , , 。
1、
? , , ( ), 。 :
delegate string/* */ ProcessDelegate(int i);
。 , , , , () 。 , , , :
1、 , string ;
2、 , int 。
OK, , :)
例:1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
5
namespace
TestApp
6
{
7
///
8
///
依頼
9
///
10
///
11
///
12
///
13
public
delegate
string
ProcessDelegate(
string
s1,
string
s2);
14
15
class
Program
16
{
17
static
void
Main(
string
[] args)
18
{
19
/*
呼び出し方法
*/
20
ProcessDelegate pd
=
new
ProcessDelegate(
new
Test().Process);
21
Console.WriteLine(pd(
"
Text1
"
,
"
Text2
"
));
22
}
23
}
24
25
public
class
Test
26
{
27
///
28
///
方法
29
///
30
///
31
///
32
///
33
public
string
Process(
string
s1,
string
s2)
34
{
35
return
s1
+
s2;
36
}
37
}
38
}
:
Text1Tex2
2、
, , :
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
TestApp{
///
///
依頼
///
///
///
///
public
delegate
string
ProcessDelegate
<
T,S
>
(T s1, S s2);
class
Program {
static
void
Main(
string
[] args) {
/*
呼び出し方法
*/
ProcessDelegate
<
string
,
int
>
pd
=
new
ProcessDelegate
<
string
,
int
>
(
new
Test().Process); Console.WriteLine(pd(
"
Text1
"
,
100
)); } }
public
class
Test {
///
///
方法
///
///
///
///
public
string
Process(
string
s1,
int
s2) {
return
s1
+
s2; } }}
:
Text1100
, 。
、
, 。 , , , 。 。 , , 。 , , 。
C# , event。 :
event ProcessDelegate ProcessEvent;
:
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
TestApp{
///
///
依頼
///
///
///
///
public
delegate
void
ProcessDelegate(
object
sender, EventArgs e);
class
Program {
static
void
Main(
string
[] args) {
/*
ステップ1
*/
Test t
=
new
Test();
/*
関連イベントのメソッドは、依頼人を見つけたことに相当します.
*/
t.ProcessEvent
+=
new
ProcessDelegate(t_ProcessEvent);
/*
アクセスメソッド
*/
Console.WriteLine(t.Process()); Console.Read(); }
static
void
t_ProcessEvent(
object
sender, EventArgs e) { Test t
=
(Test)sender; t.Text1
=
"
Hello
"
; t.Text2
=
"
World
"
; } }
public
class
Test {
private
string
s1;
public
string
Text1 {
get
{
return
s1; }
set
{ s1
=
value; } }
private
string
s2;
public
string
Text2 {
get
{
return
s2; }
set
{ s2
=
value; } }
public
event
ProcessDelegate ProcessEvent;
void
ProcessAction(
object
sender, EventArgs e) {
if
(ProcessEvent
==
null
) ProcessEvent
+=
new
ProcessDelegate(t_ProcessEvent); ProcessEvent(sender, e); }
//
独自の関連メソッドが指定されていない場合は、メソッドを呼び出してエラーが放出されます.
void
t_ProcessEvent(
object
sender, EventArgs e) {
throw
new
Exception(
"
The method or operation is not implemented.
"
); }
void
OnProcess() { ProcessAction(
this
, EventArgs.Empty); }
public
string
Process() { OnProcess();
return
s1
+
s2; } }}
? , ( ) , Process 。 。
、
, !
。 C# , 。 :
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
TestApp{
///
///
依頼
///
///
///
///
public
delegate
string
ProcessDelegate(
string
s1,
string
s2);
class
Program {
static
void
Main(
string
[] args) {
/*
呼び出し方法
*/
Test t
=
new
Test();
string
r1
=
t.Process(
"
Text1
"
,
"
Text2
"
,
new
ProcessDelegate(t.Process1));
string
r2
=
t.Process(
"
Text1
"
,
"
Text2
"
,
new
ProcessDelegate(t.Process2));
string
r3
=
t.Process(
"
Text1
"
,
"
Text2
"
,
new
ProcessDelegate(t.Process3)); Console.WriteLine(r1); Console.WriteLine(r2); Console.WriteLine(r3); } }
public
class
Test {
public
string
Process(
string
s1,
string
s2,ProcessDelegate process) {
return
process(s1, s2); }
public
string
Process1(
string
s1,
string
s2) {
return
s1
+
s2; }
public
string
Process2(
string
s1,
string
s2) {
return
s1
+
Environment.NewLine
+
s2; }
public
string
Process3(
string
s1,
string
s2) {
return
s2
+
s1; } }}
:
Text1Text2
Text1
Text2
Text2Text1
Process , 。 , , 。 , 。