Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类System.Dynamic.DynamicObject。。为什么不抽象?_C#_.net - Fatal编程技术网

C# 类System.Dynamic.DynamicObject。。为什么不抽象?

C# 类System.Dynamic.DynamicObject。。为什么不抽象?,c#,.net,C#,.net,浏览该类时,我发现它是一个具体的(不是抽象的)类,但通过使其默认构造函数受保护来阻止直接创建它的实例 那么,不使用public构造函数将其抽象化有什么意义呢 澄清: class Base1 { protected Base1() // protected constructor, concrete class { } } class Derived1 : Base1 { public Derived1() : base() { } } abstr

浏览该类时,我发现它是一个具体的(不是抽象的)类,但通过使其默认构造函数受保护来阻止直接创建它的实例

那么,不使用
public
构造函数将其抽象化有什么意义呢

澄清:

class Base1
{
    protected Base1() // protected constructor, concrete class
    {
    }
}
class Derived1 : Base1
{
    public Derived1() : base()
    {
    }
}

abstract class Base2
{
    public Base2() // public constructor, abstract class
    {
    }
}
class Derived2 : Base2
{
    public Derived2() : base()
    {
    }
}

有一条评论解释了这一点

    /// <summary>
    /// Enables derived types to initialize a new instance of the <see cref="T:System.Dynamic.DynamicObject"/> type.
    /// </summary>
    [__DynamicallyInvokable]
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    protected DynamicObject()
    {
    }
//
///使派生类型能够初始化该类型的新实例。
/// 
[[uuuu动态调用可禁用]
[TargetedPatchingOptOut(“性能对于跨NGen映像边界内联这种类型的方法至关重要”)]
受保护的DynamicObject()
{
}

它用于在某处创建具有受保护构造函数的类型为
System.Dynamic.DynamicObject

的对象这是可能的:

public class MyClass
{
    protected MyClass() { }

    public static MyClass GetInstance()
    {
        return new MyClass();
    }
}    

public class MyDerivedClass : MyClass
{
}

public static void Main()
{
    var myInstance = MyClass.GetInstance();
    var myDerivedInstance = new MyDerivedClass();

    var constructor = typeof(MyClass).GetConstructor(
                BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
                null,
                Type.EmptyTypes,
                null);

    var instanceFromReflection = (MyClass) constructor.Invoke();
}

抽象的
MyClass
既不能通过
MyClass.GetInstance()
(编译器错误在
返回新的MyClass();
)实例化,也不能通过反射类型实例化(运行时错误
System.MemberAccessException:无法创建MyClass的实例,因为它是一个抽象类。

这是一个好问题。我希望有人能尽快回答这个问题,因为我自己也很想知道!首先,我想告诉你,可能是因为只有孩子才有权访问具体的对象,但是抽象类应该执行trickWell,它没有任何抽象方法。只需使用
abstract
关键字即可启用抽象方法,因此,也许他们只是简单地在带有抽象方法的抽象类上使用
abstract
?C完全允许您声明
abstract
类,而不使用任何
abstract
memberkeyword
abstract
来限制对构造函数的访问,我想这是重点。类不是抽象的,但作者决定限制访问起初我认为“这太愚蠢了,显然你可以这么做”,但这实际上可能就是原因——如果你需要在某个地方传递一个
DynamicObject
,但实际上不需要任何实现(例如,某种null-
DynamicObject
)。省去了创建一个不必要的
类NullDynamicObject:DynamicObject{}
@Luaan的麻烦。我认为如果你的评论是一个答案,那么它应该是好的@丹尼尔:你的回答只是问题本身,没有添加任何有价值的信息。@或者我不同意。有一个问题是关于阻止直接创建,而不是从派生类创建,如果你把类抽象化,你就不能再这样做了。我不明白?如果我有一个带有
public
构造函数的
abstract类
(或者即使没有声明构造函数,也只是让它使用默认构造函数),我也可以这样做。(也就是说,我不能直接创建)没有什么新内容,它是在评论中与@sailator讨论的。当然,但评论中的讨论没有答案,尤其是如果评论被折叠。。。