ผู้รับมอบสิทธิ์ Func ทั้งหมดคืนค่า ผู้ได้รับมอบหมาย. NET ที่สามารถใช้กับวิธีที่คืนค่าเป็นโมฆะคืออะไร
ผู้รับมอบสิทธิ์ Func ทั้งหมดคืนค่า ผู้ได้รับมอบหมาย. NET ที่สามารถใช้กับวิธีที่คืนค่าเป็นโมฆะคืออะไร
คำตอบ:
ตัวแทน Func ทั้งหมดส่งคืนบางสิ่ง ผู้แทนการดำเนินการทั้งหมดส่งคืนโมฆะ
Func<TResult> จะไม่มีข้อโต้แย้งและส่งกลับ TResult:
public delegate TResult Func<TResult>()
Action<T> รับอาร์กิวเมนต์หนึ่งตัวและไม่ส่งคืนค่า:
public delegate void Action<T>(T obj)
Action เป็นตัวแทนที่ง่ายที่สุด 'เปลือย':
public delegate void Action()
นอกจากนี้ยังมีFunc<TArg1, TResult>และAction<TArg1, TArg2>(และอื่น ๆ ถึง 16 อาร์กิวเมนต์) สิ่งเหล่านี้ (ยกเว้นAction<T>) เป็นสิ่งใหม่สำหรับ. NET 3.5 (กำหนดไว้ใน System.Core)
Func<,,, ... ,>. NET 4.0) แต่มีการกำหนด "ประเภท" แปดชุดสุดท้ายในแต่ละชุดSystem.Core.dllไม่ใช่ในmscorlib.dllเหตุผลนั้นจะเป็นเหตุผล ทำไม michielvoo ไม่เห็นพวกเขา อย่างไรก็ตามไม่มีการเพิ่ม Funcs หรือ Actions ใน .NET เวอร์ชัน 4.5 และ 4.5.1 อีกต่อไป ลำดับนี้จะกลายเป็นA170836หรือA170875หรือไม่ คอยติดตาม.
... ไม่รับอาร์กิวเมนต์และมีประเภทการคืนเป็นโมฆะ?
ฉันเชื่อว่าActionเป็นวิธีแก้ปัญหานี้
ผู้รับมอบสิทธิ์ Func ทั้งหมดใช้พารามิเตอร์อย่างน้อยหนึ่งพารามิเตอร์
ที่ไม่เป็นความจริง. พวกเขาทั้งหมดใช้อาร์กิวเมนต์อย่างน้อยหนึ่งประเภท แต่อาร์กิวเมนต์นั้นเป็นตัวกำหนดประเภทการส่งคืน
ดังนั้นจึงFunc<T>ไม่ยอมรับพารามิเตอร์และส่งคืนค่า ใช้ActionหรือAction<T>เมื่อคุณไม่ต้องการคืนค่า
ลองSystem.Func<T>และSystem.Action
Converter<TInput, TOutput> Func<T, TResult>มันถูกใช้ในList<>.ConvertAllวิธีการซึ่งคาดว่าองค์ประกอบในทุกList<>บนวัตถุอื่นและวางไว้ทั้งหมด "ค่าฟังก์ชั่น" List<>ในใหม่ (หลังจากนั้นมักจะใช้ Linq Selectสำหรับเรื่องนั้น)
ในบางครั้งคุณจะต้องเขียนผู้รับมอบสิทธิ์สำหรับการจัดการเหตุการณ์ซึ่งในกรณีนี้คุณสามารถใช้ประโยชน์จากการSystem.EvenHandler<T>ที่ยอมรับอาร์กิวเมนต์ชนิดโดยนัยobjectนอกเหนือไปจากพารามิเตอร์ตัวที่สองที่ควรได้รับจากEventArgsนอกเหนือไปจากพารามิเตอร์ตัวที่สองที่ควรจะเป็นผลมาจากผู้จัดกิจกรรมจะกลับมาvoid
ฉันพบว่ามีประโยชน์นี้เป็นการส่วนตัวระหว่างการทดสอบเพื่อสร้างการติดต่อกลับครั้งเดียวในเนื้อหาของฟังก์ชัน
... ไม่รับอาร์กิวเมนต์และมีประเภทการคืนเป็นโมฆะ?
หากคุณกำลังเขียนเพื่อSystem.Windows.Formsคุณยังสามารถใช้:
public delegate void MethodInvoker()
วิธีที่ง่ายมากในการเรียกใช้รูทีนย่อย return และ non value return กำลังใช้FuncและActionตามลำดับ (โปรดดูhttps://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
ลองตัวอย่างนี้
using System;
public class Program
{
private Func<string,string> FunctionPTR = null;
private Func<string,string, string> FunctionPTR1 = null;
private Action<object> ProcedurePTR = null;
private string Display(string message)
{
Console.WriteLine(message);
return null;
}
private string Display(string message1,string message2)
{
Console.WriteLine(message1);
Console.WriteLine(message2);
return null;
}
public void ObjectProcess(object param)
{
if (param == null)
{
throw new ArgumentNullException("Parameter is null or missing");
}
else
{
Console.WriteLine("Object is valid");
}
}
public void Main(string[] args)
{
FunctionPTR = Display;
FunctionPTR1= Display;
ProcedurePTR = ObjectProcess;
FunctionPTR("Welcome to function pointer sample.");
FunctionPTR1("Welcome","This is function pointer sample");
ProcedurePTR(new object());
}
}