2015-08-17 3 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; 
    } 
} 

Почему новое ключевое слово, используемое после общественного? Что оно делает? Как это называется?

+4

Он используется, чтобы скрыть свойство с тем же именем в базовом классе – deathismyfriend

+0

См. Перегрузку свойств. Я бы ожидал некоторых атрибутов вместе с декларацией. Это может изменить значение по умолчанию, правила сериализации и т. Д. – AlexS

ответ

3

Оба примера, которые вы указали, одинаковы. «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 

Вы просто должны понимать разницу между «новым» и «переопределить»

Edit: Как @jafar сказал, опуская новое на производный класс не является неправильным либо. использование new только говорит компилятору, что мы хотим скрыть элемент базового класса.

+0

Просто добавьте, что опускание нового не является ошибкой. Он просто сообщает компилятору и нам, что вы знаете, что делаете, когда переписываете метод в производном классе. –

Смежные вопросы