为什么默认C#类(由Microsoft编写)不';I don’我不能遵守与编码员编写的类相同的C#规则

为什么默认C#类(由Microsoft编写)不';I don’我不能遵守与编码员编写的类相同的C#规则,c#,C#,我的问题是,如果我在类a中没有默认构造函数(这是一个基类,并且有其他2或3个非默认构造函数),我如何在类B中运行一个非默认构造函数,它是从类a派生的 但我发现默认C类的情况并非如此,我在asp.net mvc中使用值提供程序时遇到了一个名为FormValueProvider的类,它是从它的基类NameValueCollectionValueProvider派生的 FormValueProvider只有一个构造函数具有ControllerContext类型的参数。 它的基类NameValueCol

我的问题是,如果我在
类a
中没有默认构造函数(这是一个基类,并且有其他2或3个非默认构造函数),我如何在
类B
中运行一个非默认构造函数,它是从
类a
派生的

但我发现默认C类的情况并非如此,我在asp.net mvc中使用值提供程序时遇到了一个名为
FormValueProvider
的类,它是从它的基类
NameValueCollectionValueProvider
派生的

FormValueProvider
只有一个构造函数具有ControllerContext类型的参数。 它的基类
NameValueCollectionValueProvider
有两个构造函数,一个具有类型
NameValueCollection
CultureInfo
的两个参数,另一个具有三个参数,其中两个是类型
NameValueCollection
,第三个是类型
CultureInfo.


NameValueCollectionValueProvider
没有默认构造函数。为什么这条规则适用于编写自己的代码而不适用于Microsoft编写的默认C#类的程序员。

这些类完全可能使用
内部构造函数。例如:

public class BaseClass 
{
    internal BaseClass() {}

    protected BaseClass(String myString) 
    {
        /* do some stuff */
    }
}

public class ChildClass 
{
    public ChildClass()
        : base() 
    {
        /* do some stuff */
    }
}

如果构造函数是
内部的
,那么它将只对同一命名空间内的对象可见(例如它的子类)。除非您从.NET库中反编译代码,否则作为开发人员,您将永远看不到它。

因为他们分别使用
this
base
调用它们

例如,
FormvalueProvider
上的此构造函数调用
FormvalueProvider
上的另一个构造函数:

public FormValueProvider(ControllerContext controllerContext)
           : this(controllerContext,
             new UnvalidatedRequestValuesWrapper(controllerContext.HttpContext.Request.Unvalidated()))
internal FormValueProvider(ControllerContext controllerContext, IUnvalidatedRequestValues unvalidatedValues) 
             : base(controllerContext.HttpContext.Request.Form, 
                    unvalidatedValues.Form, 
                    CultureInfo.CurrentCulture)
然后调用
NameValueCollectionValueProvider
上的构造函数:

public FormValueProvider(ControllerContext controllerContext)
           : this(controllerContext,
             new UnvalidatedRequestValuesWrapper(controllerContext.HttpContext.Request.Unvalidated()))
internal FormValueProvider(ControllerContext controllerContext, IUnvalidatedRequestValues unvalidatedValues) 
             : base(controllerContext.HttpContext.Request.Form, 
                    unvalidatedValues.Form, 
                    CultureInfo.CurrentCulture)
请注意,第二个构造函数是
internal
。。这意味着你将无法调用特定的重载。这里发生的事情是,它们为特定重载提供了默认值,这意味着您不必为它们指定默认值,就可以到达目的地

base
关键字的文档如下:

在C#中没有这样的规则,您可以从具有非默认构造函数的基类继承。为了使派生类工作,其构造函数必须使用关键字调用基类构造函数

因此,您可以实现如下的类层次结构:

class Employee {
    public Employee(string title) {}
}

class Manager: Employee {
    public Manager() : base("Manager") {}
}

因此,
Manager
可以继承自
Employee
并具有不同的构造函数-只要
Manager
Employee
类上调用有效的构造函数。

您确定吗?您知道可以从派生类上的任何构造函数调用基类上的任何构造函数,对吗?最有可能的是派生类上的构造函数正是这样做的——链接构造调用MVC是开源的,所以我建议您看看它在做什么。您的描述并不表示它正在执行任何特殊操作,它要么使用默认属性调用其基类构造函数,要么从
ControllerContext
调用这些属性,要么调用从程序集外部看不到的内部构造函数。不需要默认构造函数。我很少在服务类上有一个默认构造函数。@user2864740我确实知道那个家伙,但如果你真的想理解我说的话。当我去看派生类及其基类的定义时,我在派生类中看不到像base:()这样的东西,所以这是整个混淆点。我确实知道base和这个关键字,以及我们如何在编码中使用它们,但这里回答的每个人都说,除非反编译程序集,否则所有这些都是不可见的。这就是我困惑的地方。不过还是要感谢你在这个论坛上提供的信息。不用担心。的确,从外表看,这似乎有点像魔法。虽然挖苦一点也不会有什么坏处:)我确实认识那个家伙,但如果你真的想理解我说的话。当我去看派生类的定义时,我在派生类中看不到类似base:()的东西,而它的基类sp正是混淆的焦点。