標籤:exception oca lambda運算式 public 情況 pac namespace mes system
using System;using static System.Console;//委託 降低耦合//如果一個函數的參數是一個函數//就可以定義一個委託namespace ConsoleApp{ class Program { //委託 //可以在類的內部、外部,名字空間 定義委託 //相當於一個函數類型 public delegate void WtiteAString(int i); public static void fun(int i) { WriteLine(i); } public static void fun1() { } static void Main(string[] args) { //複製會重新分配一個方法 WtiteAString write = fun; write = new WtiteAString(fun); write(1); //Action<T>委託,傳回型別為void Action<int> op1 = fun; op1(2); Action d = fun1; //Func<T>委託 //單參,表示傳回型別,多參前面表示方法的參數,最後一個表示傳回型別 Func<int, double> op2; //多播委託,使用+ += - -= //其調用的順序並未正式定義,所以要避免寫依賴順序調用方法的代碼 op1 += fun; //如果委託調用的一個方法引發了異常,委託迭代就會停止,不再調用其他方法 //為避免這種情況,應自己迭代方法列表 Action d1 = fun1; d1 += fun1; Delegate[] delegates = d1.GetInvocationList(); foreach (Action d2 in delegates) { try { d2(); } catch (Exception) { WriteLine("Exception caught"); } } //匿名方法 委託一個現寫的函數 //匿名方法不能使用跳躍陳述式(break goto continue)跳到該匿名方法外部 //不能訪問外部ref、out參數,但可以使用其他的外部變數 string mid = ", middle part,"; Func<string, string> anonDel = delegate (string param) { param += mid; param += " and this was added to the string."; return param; }; WriteLine(anonDel("start of string")); //lambda運算式 Func<string, string> oneParam = s2 => $"change uppercase {s2.ToUpper()}"; //s2為參數 WriteLine(oneParam("test")); //多個參數 Func<double, double, double> twoParams = (x, y) => x * y; WriteLine(twoParams(2, 3)); } }}
C#委託