gpt4 book ai didi

c# - 阴影字段未在基类构造函数中设置

转载 作者:行者123 更新时间:2023-11-30 19:24:26 27 4
gpt4 key购买 nike

为什么当我在基类构造函数中设置一个隐藏字段(使用 new 关键字声明)时,被隐藏的字段被设置,而不是被隐藏的字段?

我认为 this.GetType() 一直引用最外层的类,一直到基类调用,包括构造函数。我还认为阴影使阴影区域不可访问。

在我的快速观察中,我可以看到两个字段,已设置的阴影字段和尚未初始化的(子类的)阴影字段。

我通过在子类构造函数调用基类构造函数后显式设置阴影字段来修复它,但我仍然想知道为什么它会这样。 .Net Fiddle

using System;

public class Program
{
public static void Main()
{
SubClass subClass = new SubClass(2);
Console.WriteLine(subClass.MyField);
}
}

public class BaseClass
{
public BaseClass(int value)
{
MyField = value; // This doesn't point to SubClass.MyField
}

public int MyField;
}

public class SubClass : BaseClass
{
public SubClass(int value):base(value)
{

}

public new int MyField = 4;

}

更新

查看答案后,我发现我没有以最直接的方式问出我想知道的内容。任何不便敬请谅解。这是我真正想知道的:

我确实了解阴影。我不同意。我不认为它应该被允许用于字段(只要可覆盖的字段成为语言功能)。我看不到阴影场和阴影场四处游荡的意义。但是,我确实看到了可覆盖字段中的要点,我不明白为什么该语言功能在属性和方法存在时不存在。那么,为什么要在字段上设置阴影?为什么没有覆盖字段?

最佳答案

我们有

I also thought that shadowing made the shadowed field not accessible.

紧随其后

I do understand shadowing.

我不完全确定你这样做。你已经表达了一个关于影子的错误信念;我们怎么知道没有更多?

I don't agree with it.

您的意见已记录。我注意到,如果您不喜欢该功能,则无需使用它。

I don't think it should be allowed for fields (as long as overridable fields were made a language feature).

记下了。

I do however see the point in overridable fields and I don't understand why that language feature doesn't exist when it exists for properties and methods.

字段应该是类的私有(private)实现细节。如果是,则没有可访问的名称可以隐藏或覆盖,因此问题没有实际意义。我们不希望任何人使用的功能是不好的功能。

So, why have shadowing on fields?

假设派生类中有一个 protected 字段。现在考虑脆弱的基类问题。经历许多这样的场景; 您正在批评语言设计选择,所以请像语言设计者一样思考。您从对典型的脆弱基类场景的调查中得出什么结论?

Why is there not overriding on fields?

因为(1)我们没有覆盖字段的机制;方法有虚表,但字段没有虚表机制。 (2) 字段应该是类的私有(private)实现细节,因此永远不需要覆盖它们。如果你想覆盖一个字段,创建一个包装它的属性并覆盖它。从字段到虚拟属性的代码更改微小

字段应该在类的机制域中;属性在业务域中。行为的特化属于业务领域。

关于c# - 阴影字段未在基类构造函数中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36872094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com