Designer中BeginInit()和EndInit()方法的作用

时间:2015-05-26 15:27:29

标签: c# .net winforms

我认为,Designer使用ISupportInitialize接口的那些方法来支持优化,确保控件初始化的原子性,并防止在初始化期间对控件执行任何操作。我的问题是:

  1. 他们以什么方式帮助Designer优化控件的初始化?
  2. 为什么要确保初始化的原子性?
  3. 是否有任何合理的示例何时在不是由Designer生成的代码中使用它们?

2 个答案:

答案 0 :(得分:6)

它与优化没有任何关系。当您的控件对分配属性的顺序敏感时,ISupportInitialize是您需要的接口。没有任何方法可以影响设计师分配它们的顺序,它按字母顺序排列。

您通常在BeginInit()方法中将 bool 变量设置为true,您可以在属性设置器中对此进行测试,并在设置时不执行任何操作。然后,您的EndInit()方法会使属性值生效。

您可以在ErrorProvider component中看到一个很好的例子。请注意它如何使用这些方法来推迟数据绑定。 PictureBox control是另一个很好的例子,它用它来推迟图像下载。 TrackBar是另一个示例,它使用它来确保Value属性介于最小值和最大值之间。 Etcetera,.NET Framework源代码通常是查看.NET类型在实践中如何使用的好地方。

答案 1 :(得分:0)

根据定义,Designer允许在可视模式下创建控件,然后由Visual Studio生成用于初始化控件的相应代码。

初始化在一个地方完成,以避免代码中的任何空引用问题。您希望在使用其引用时确实已经创建了所有控件。

如果您想基于特定的构造函数动态创建接口,则可以完美地创建控件初始化。