1、集合擴展方法
用於集合操做的擴展方法有Where、Select、Max、Min、Sum、OrderBy、ToList、First、FirstOrDefault、Single、SingleOrDefault等。原來還有Max、Min、Sum這些擴展方法,並且ToList也是擴展的。上一篇有寫過MyWhere方法,MySum可這樣寫:
public static int MySum<T>(this IEnumerable<T> data, Func<T, int> func) {
int sum = 0;
foreach (T item in data) {
sum += func(item);
}
return sum;
}
First與FirstOrDefault的區別在於,集合爲空或null時,前者會報錯,後者則返回空。而若是集合中元素大於一個時,Single和SingleOrDefault會報InvalidOperationException:"Sequence contains more than one element"錯誤。
2、委託的運算
委託也能夠進行加減運算,若有兩個符合Action<int>簽名的方法F1和F2:
static void F1(int i) {
Console.WriteLine("this's f1:" + i);
}
static void F2(int i) {
Console.WriteLine("this's f2:" + i);
}
用委託a1和a2分別指向F一、F2,而後a3爲前兩個委託的和:
Action<int> a1 = F1;
Action<int> a2 = F2;
Action<int> a3 = a1 + a2;
執行a3(1)時,會依次運行F1和F2方法,同時它們接受的參數都爲1。
執行a3 =a3 - a1後,再次運行a3,則只會執行F2,由於a1被減掉了。若是委託有返回值,相加後的委託執行後的返回值爲最後一個方法的返回值。
3、事件
Person類中有事件On12Y,Person的Age每增長12歲,會觸發該事件
class Person {
private int age;
public int Age {
get => age;
set {
if (value % 12 == 0) {
//if (On12Y != null) {
// On12Y();
//}
On12Y?.Invoke();
}
}
}
public event Action On12Y;
}
//調用,事件觸發時調用P1_On12Y
var p1 = new Person();
p1.On12Y += P1_On12Y;
//p1.On12Y = null;
for (var i = 1; i <= 49; i++) {
p1.Age = i;
}
這是事件的基本使用。
關於事件與委託的關係,能夠嘗試將上面代碼中的public event Action On12Y;修改成public Action On12Y;去掉event修飾符,On12Y就變成了普通的委託,而後在使用時除了能夠註冊、註銷事件外,還能夠進行p1.On12Y = null之類的操做。可見事件與委託的區別在於事件在委託的基礎上作了限制,只能註冊、註銷本身。
但事件並非「特殊的委託」這麼簡單,事件的完整寫法爲:
public Action _on12Y;
public event Action On12Y {
add {
this._on12Y += value;
}
remove {
this._on12Y -= value;
}
}
與屬性相似,可見事件是對委託的封裝。
關於Winform中的事件句柄EventHandler,也是一種委託:public delegate void EventHandler(object sender, EventArgs e);
其簽名爲事件觸發者和事件參數。
學習資料:如鵬網.net提升班http://www.rupeng.com/News/10/4603.shtml
html