簡介:
封裝一個方法,該方法只有一個參數(shù)并且不返回值??梢允褂?Action< T> 委托以參數(shù)形式傳遞方法,而不用顯式聲明自定義的委托。封裝的方法必須與此委托定義的方法相對應(yīng)。 即封裝的方法必須具有一個通過值傳遞給它的參數(shù),并且不能返回值。 Action<T1,T2 ......> 委托還可以多個參數(shù)傳入。如果有返回值,則使用Fun<T, TResult>。
介紹
public delegate void Action<in T>( T obj )
類型參數(shù) in T ---- 此委托封裝的方法的參數(shù)類型。
參數(shù) obj ------類型:T,此委托封裝的方法的參數(shù)。
使用
在使用 Action< T> 委托時,不必顯式定義一個封裝只有一個參數(shù)的方法的委托。
- 聲明了一個名為 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> 委托作為參數(shù)。通過使用由委托封裝的方法,可以對數(shù)組或列表中的每個元素執(zhí)行操作。
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方法顯示列表的內(nèi)容
names.ForEach(Print);
// 通過匿名方法顯示列表的內(nèi)容
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; // 定義有一個參數(shù)的
// 用來傳參的
pubilc void setAction(int account)
{
LoginTest(account);//傳參
}
}
public class TestLoginUI : MonoBehaviour
{
TestAction testAction = new TestAction();
private void Awake()
{
testAction.LoginTest += LoginSuccess; //添加調(diào)用
}
void LoginSuccess(int index)
{
Debug.Log("登陸賬號:"+ index);//執(zhí)行
}
private void OnDisable()
{
testAction.LoginTest -= LoginSuccess;//去掉
}
}