2015-08-17 39 views
-3

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

后公众为何使用new关键字?它有什么作用?这个叫什么?

+4

它用于隐藏基类中名为相同名称的属性 – deathismyfriend

+0

请参阅属性重载。我希望一些属性以及声明。它可能会更改默认值,序列化规则等。 – AlexS

回答

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 

你一定要明白“新”和“覆盖”之间的区别

编辑:作为@jafar说,在派生类中省略新的没有错无论是。使用new只会告诉编译器我们要隐藏基类成员。

+0

只需添加省略new即可。它只是告诉编译器和我们,当你在派生类中重写一个方法时,你知道你在做什么。 –