ผู้รับมอบสิทธิ์ 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());
}
}