一个窗口的默认构造函数必须是公共的吗?

3

我正在为我的WPF应用程序设计一个对话框窗口。我知道WPF要求所有控件都有默认构造函数,我可以创建需要的所有参数的构造函数。但是默认构造函数必须是公共的吗?我可以将其设置为内部的、私有的或者甚至是受保护的吗?


如果不公开,你(或任何自动机制)就无法在类外创建该类的实例,也许可以使用反射来实现。 - King King
可能是在类中我们应该总是包含一个默认构造函数吗?的重复问题。虽然不完全相同,但回答者包含了OP想要的内容。 - nsgocev
那要看具体需求。如果你不想让类外部访问默认构造函数,就将其设为私有;如果你不想让程序集外部访问,则将其设为内部的。 - Habib
如果您没有默认构造函数或者它不是公共的,那么您无法从 Xaml 实例化它。如果这对您来说没问题,那就继续吧。 - Sriram Sakthivel
2个回答

6

在WPF中,控件不需要默认构造函数,除非您想从XAML实例化控件。

像这样的控件是完全合法的:

public partial class MyUserControl : UserControl
{
      public MyUserControl(string someParameter) : this()
      { 
         InitializeComponent();
      }
}

如图所示,已删除默认构造函数,您需要确保调用InitializeComponent();。如果您从XAML实例化控件,则嵌入控件必须可见默认构造函数。因此,如果嵌入控件在同一程序集中,则可以是internal,否则必须是public

这是一个对话框。在此应用程序中,它不会在XAML中实例化。 - Tony Vitabile
@TonyVitabile,那么你的构造函数只需要对调用代码可见即可。 - thumbmunkeys
同意。有多个构造函数。有一个默认构造函数调用InitializeComponent,因为VS默认构建它。还有另一个需要参数的构造函数。它做的第一件事就是调用默认构造函数。我只是不希望类外面的代码调用默认构造函数。实际上,我可能可以完全删除默认构造函数。 - Tony Vitabile
是的,您需要调用 InitializeComponent()。将默认构造函数设置为私有,并从非默认构造函数中调用它。我想我误解了您的问题所在。 - thumbmunkeys
是的,我知道我必须调用 IntializeComponent。如果我删除了默认构造函数,我会将调用 InitializeComponent 移到公共构造函数中。将默认构造函数设置为私有后,它可以正常工作。我曾经认为,如果默认构造函数不存在或不是公共的,VS 中的设计师会出问题。 - Tony Vitabile
当我将我的MainWindow构造函数设置为internal时,我会收到以下错误:System.Windows.Markup.XamlParseException: ''No matching constructor found on type MainWindow. You can use the Arguments or FactoryMethod directives to construct this type. 即使MainWindow类本身是internal的,在XAML中添加x:ClassModifier="internal"后也可以正常工作。这让我更加奇怪,为什么我无法将构造函数设置为internal - SportySpice

1
将构造函数设为 internal,可以确保该类型只能由当前程序集中的类型实例化,即使以后决定将该类型公开,也不会解除其实例化限制。换句话说,您可以决定更改类型的可见性,而不解除其实例化限制。
将构造函数设为 public 则产生相反的效果(显然),如果希望在任何可见位置实例化该类型,则可能是明智的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接