_cuclife.com
当前位置:cuclife.com > IT > ASP.NET >

.NET组件编程(9) 补充 ISupportInitialize

本来不打算写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);
        }
    }
}

文章来源:网络整理  本站编辑:兰特
上一篇:详解.NET 4.0代码契约组件
下一篇:.NET组件编程(8) Component DocumentDesigner(文
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)