本來不打算寫ISupportInitialize的,但是自己總覺得系列不完整,所有還是寫下了這篇 ISupportInitialize的文章。其實ISupportInitialize這個接口在Component裡也是很有用的,那到底 ISupportInitialize是干什麼用的呢?
msdn上的解釋為:指定該對象支持對批初始化的簡單的事務處理通知。ISupportInitialize 允許控件 為多組屬性而優化。因此,可以在設計時初始化相互依賴的屬性或批設置多個屬性。
ISupportInitialize下有兩個方法:BeginInit和EndInit,調用 BeginInit 方法用信號通知對象初始 化即將開始,調用 EndInit 方法用信號通知初始化已完成。
那ISupportInitialize又是如何解決屬性之間的依賴關系的呢?請看下面源代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
namespace ClassLibrary1
{
/**//*
要求:我們需要在Class1初始化完成後去執行Test1方法。
那我們需要把調用Test1寫在哪裡呢?
位置1:不行 因為調用Class1的構造函數的時,屬性A和B都還沒有賦值。
位置2:不行 雖然屬性A已經賦值,但是屬性B還沒有值。
位置3:行 這個時候屬性A和B都已經賦值。
位置4:行 此時所有的屬性都賦值完成了。
那為什麼不直接把Test的調用寫在位置2或者3上呢?主要原因是:程序員在開發過程中不容易 知道屬性賦值的先
後順序(即初始化Class1的時候,是先對A賦值還是先對B賦值),而位置4則可以肯定所有的屬 性都已經賦過值了。
*/
public class Class1 : Component, ISupportInitialize
{
public Class1()
{
// 位置1
}
private string _a;
public string A
{
get { return _a; }
set
{
_a = value;
// 位置2
}
}
private string _b;
private string B
{
get { return _b; }
set {
_b = value;
// 位置3
}
}
// Component開始初始化
public void BeginInit()
{
}
// Component完成初始化
public void EndInit()
{
_c2.B(); // 位置4
}
public void Test1() // 這個方法依賴屬性A和屬性B
{
MessageBox.Show(A + ":" + B);
}
}
}
如果有什麼問題,請給我留言或者給我評論。