简介:
封装一个方法,该方法只有一个参数并且不返回值。可以使用 Action< T> 委托以参数形式传递方法,而不用显式声明自定义的委托。封装的方法必须与此委托定义的方法相对应。 即封装的方法必须具有一个通过值传递给它的参数,并且不能返回值。 Action<T1,T2 ......> 委托还可以多个参数传入。如果有返回值,则使用Fun<T, TResult>。
介绍
public delegate void Action<in T>( T obj )
类型参数 in T ---- 此委托封装的方法的参数类型。
参数 obj ------类型:T,此委托封装的方法的参数。
使用
在使用 Action< T> 委托时,不必显式定义一个封装只有一个参数的方法的委托。
- 声明了一个名为 DisplayMessage 的委托,并将对 WriteLine 方法或 ShowWindowsMessage 方法的引用分配给其委托实例。
using System;
using System.Windows.Forms;
//声明委托
delegate void DisplayMessage(string message);
public class TestCustomDelegate
{
public static void Main()
{
//实例化委托
DisplayMessage messageTarget;
//分配委托
if (Environment.GetCommandLineArgs().Length > 1)
messageTarget = ShowWindowsMessage;
else
messageTarget = Console.WriteLine;
messageTarget("Hello, World!");
}
private static void ShowWindowsMessage(string message)
{
MessageBox.Show(message);
}
}
2.实例化 Action< T> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。
using System;
using System.Windows.Forms;
public class TestAction1
{
public static void Main()
{
//实例化Action委托
Action<string> messageTarget;
//直接分配
if (Environment.GetCommandLineArgs().Length > 1)
messageTarget = ShowWindowsMessage;
else
messageTarget = Console.WriteLine;
messageTarget("Hello, World!");
}
private static void ShowWindowsMessage(string message)
{
MessageBox.Show(message);
}
}
3.Action< T> 委托与匿名方法一起使用。
using System;
using System.Windows.Forms;
public class TestAnonMethod
{
public static void Main()
{
//实例化Action委托
Action<string> messageTarget;
//通过匿名方法分配给委托
if (Environment.GetCommandLineArgs().Length > 1)
messageTarget = delegate(string s) { ShowWindowsMessage(s); };
else
messageTarget = delegate(string s) { Console.WriteLine(s); };
messageTarget("Hello, World!");
}
private static void ShowWindowsMessage(string message)
{
MessageBox.Show(message);
}
}
4.lambda 表达式分配给 Action< T> 委托实例。
using System;
using System.Windows.Forms;
public class TestLambdaExpression
{
public static void Main()
{
//实例化委托
Action<string> messageTarget;
//通过lambda表达式分配给委托
if (Environment.GetCommandLineArgs().Length > 1)
messageTarget = s => ShowWindowsMessage(s);
else
messageTarget = s => Console.WriteLine(s);
messageTarget("Hello, World!");
}
private static void ShowWindowsMessage(string message)
{
MessageBox.Show(message);
}
}
5.ForEach 和 ForEach< T> 方法都采用Action< T> 委托作为参数。通过使用由委托封装的方法,可以对数组或列表中的每个元素执行操作。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");
// 使用Print方法显示列表的内容
names.ForEach(Print);
// 通过匿名方法显示列表的内容
names.ForEach(delegate(String name)
{
Console.WriteLine(name);
});
}
private static void Print(string s)
{
Console.WriteLine(s);
}
}
6.测试使用
public class TestAction
{
public Action<int> LoginTest; // 定义有一个参数的
// 用来传参的
pubilc void setAction(int account)
{
LoginTest(account);//传参
}
}
public class TestLoginUI : MonoBehaviour
{
TestAction testAction = new TestAction();
private void Awake()
{
testAction.LoginTest += LoginSuccess; //添加调用
}
void LoginSuccess(int index)
{
Debug.Log("登陆账号:"+ index);//执行
}
private void OnDisable()
{
testAction.LoginTest -= LoginSuccess;//去掉
}
}
网友评论