C# 新关键字的奇怪用法

C# 新关键字的奇怪用法,c#,.net,C#,.net,所以我在.NET源代码中翻找,发现了一个非常奇怪的部分。代码如下: public new Point AutoScrollPosition { get { return base.AutoScrollPosition; } set { base.AutoScrollPosition = value; } } 而且: [Browsable(false), EditorBrowsable(EditorBrowsabl

所以我在.NET源代码中翻找,发现了一个非常奇怪的部分。代码如下:

public new Point AutoScrollPosition
{
    get
    {
        return base.AutoScrollPosition;
    }

    set
    {
        base.AutoScrollPosition = value;
    }
}
而且:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
new public event EventHandler AutoSizeChanged
{
    add
    {
        base.AutoSizeChanged += value;
    }
    remove
    {
        base.AutoSizeChanged -= value;
    }
}

为什么在public之后使用新关键字?它有什么作用?这叫什么?

你给出的两个例子都是一样的。new意味着您有一个同名的成员,但使用新的实现将其隐藏

class A
{
    public string Member { get { return "A"; } }
}

class B : A
{
    public new string Member { get { return "B"; } }
}

A realA = new A();
B realB = new B();
A fakeA = new B();

Console.WriteLine(realA.Member); // Prints "A"
Console.WriteLine(realB.Member); // Prints "B", Only way to print "B" is to be a B and not casted to anything (real B)
Console.WriteLine(fakeA.Member); // Prints "A"
Console.WriteLine((realB as A).Member); // Prints "A", here we won't see hidden members
您只需要理解new和override之间的区别


编辑:正如@jafar所说,在派生类中省略new也没有错。使用new只会告诉编译器我们要隐藏基类成员。

它用于隐藏基类中名为相同的属性请参见属性重载。我希望声明中包含一些属性。它可能会更改默认值、序列化规则等,只是为了补充一点,省略new并不是错误。它只是告诉编译器和我们,当您在派生类中重新编写方法时,您知道自己在做什么。