程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET組件編程(9) 補充 ISupportInitialize

.NET組件編程(9) 補充 ISupportInitialize

編輯:關於.NET

本來不打算寫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);
        }
    }
}

如果有什麼問題,請給我留言或者給我評論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved