新关键字的奇怪用法

本文关键字:用法 关键字 | 更新日期: 2023-09-27 18:08:19

所以我在。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"answers"override"之间的区别

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