По правде говоря, они оба выполняют одно и то же. Если вы разрабатываете средства управления для своей организации, то поместить его в init будет просто замечательно (так как он будет работать, даже если это «технически то место, где оно должно быть», но MS создала метод, в котором они ожидают, что он пойдет .
Если вы похожи на Telerik, где вы создаете элементы управления, которые будет использовать кто-то другой, то я бы определенно поместил его в класс CreateChildControls
. Зачем? Потому что это то, что люди ожидают, и это то, что MS хочет, чтобы разработчики управления делали. В этой ситуации вы должны быть обеспокоены (особенно если разрабатываемые вами элементы управления не запечатаны), что кто-то может переопределять различные методы, и, как вы видели, многие люди переопределяют класс init
, чтобы код работает так, как они хотят. Вы всегда хотите избежать ситуации, когда ваш код таинственным образом не работает, потому что они забыли вызвать базовый метод, и это не задокументировано. Когда вы помещаете его в метод CreateChildControls
, вы говорите другим разработчикам: «Я, вероятно, что-то делаю с созданием элементов управления, которые вы хотите принять к сведению». Я всегда думал бы классифицировать основу этого метода, если переопределю его.
Еще одна замечательная вещь, которую можно поместить в CreateChildControls
, заключается в том, что многие люди, вероятно, не знают об этом (и люди, которые знают, для чего он используется). Поэтому, когда они наследуют ваш контроль и обезьяну с помощью Init
и забывают вызвать базовый метод Init
, ваш код все еще «волшебным образом» работает, и им не приходится суетиться, выясняя, что пошло не так. *