C# BeginInit()和EndInit()方法在设计器中的作用

C# BeginInit()和EndInit()方法在设计器中的作用,c#,.net,winforms,C#,.net,Winforms,我已经注意到,设计器使用ISupportInitialize接口的这些方法来支持优化,确保控件初始化的原子性,并防止在初始化过程中对控件执行任何操作。我的问题是: 它们以何种方式帮助设计器优化控件的初始化 为什么要确保初始化的原子性 在非由设计器生成的代码中使用它们时,是否有合理的示例 根据定义,设计器允许在可视模式下创建控件,然后VisualStudio生成用于初始化控件的适当代码 初始化在一个地方完成,以避免代码后面出现任何空引用问题。当您使用它们的引用时,您确实希望已经创建的每个控件 例如

我已经注意到,设计器使用
ISupportInitialize
接口的这些方法来支持优化,确保控件初始化的原子性,并防止在初始化过程中对控件执行任何操作。我的问题是:

  • 它们以何种方式帮助设计器优化控件的初始化
  • 为什么要确保初始化的原子性
  • 在非由设计器生成的代码中使用它们时,是否有合理的示例

  • 根据定义,设计器允许在可视模式下创建控件,然后VisualStudio生成用于初始化控件的适当代码

    初始化在一个地方完成,以避免代码后面出现任何空引用问题。当您使用它们的引用时,您确实希望已经创建的每个控件


    例如,如果希望基于特定构造函数动态创建接口,则完全可以创建控件初始化

    这与优化无关<代码>ISupportInitialize是控件对属性分配顺序敏感时所需的接口。没有任何方法可以影响设计师分配它们的顺序,而是按字母顺序分配

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


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

    那么您是说
    BeginInit()
    EndInit()
    在设计器中按字母顺序放置属性?属性的顺序如何影响控件?不,你错过了一英里。不知道如何更好地解释它或给出更多的用法示例。只要把它放在架子上,你迟早会发现你为什么需要它。