奇怪地使用新关键字

时间:2015-08-17 22:57:38

标签: c# .net

所以我在.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;
    }
}

为什么新的关键字在公开后使用?它有什么作用?这叫什么?

1 个答案:

答案 0 :(得分:3)

您提供的两个示例都是相同的。 "新"表示您拥有相同名称的成员,但您使用新实现隐藏它。

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"之间的区别。和"覆盖"

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