Чтобы добавить в ответ @ Rawling, можно показать практические примеры, используя такой пример:
class Base
{
// base property
public virtual string Name
{
get { return "Base"; }
}
}
class Overriden : Base
{
// overriden property
public override string Name
{
get { return "Overriden"; }
}
}
class New : Base
{
// new property, hides the base property
public new string Name
{
get { return "New"; }
}
}
1. Переопределение
В случае свойства overriden слот виртуального метода базового класса заменяется другой реализацией. Компилятор видит метод как виртуальный и должен разрешить его реализацию во время выполнения, используя виртуальную таблицу объекта.
{
Base b = new Base();
Console.WriteLine(b.Name); // prints "Base"
b = new Overriden();
// Base.Name is virtual, so the vtable determines its implementation
Console.WriteLine(b.Name); // prints "Overriden"
Overriden o = new Overriden();
// Overriden.Name is virtual, so the vtable determines its implementation
Console.WriteLine(o.Name); // prints "Overriden"
}
2. Скрытие
Когда метод или свойство скрыто с помощью ключевого слова new
, компилятор создает новый невиртуальный метод только для производного класса; метод базового класса остается нетронутым.
Если тип переменной Base
(т.е. содержит только виртуальный метод), его реализация будет разрешена через vtable. Если тип переменной New
, то будет вызван не виртуальный метод или свойство.
{
Base b = new Base();
Console.WriteLine(b.Name); // prints "Base"
b = new New();
// type of `b` variable is `Base`, and `Base.Name` is virtual,
// so compiler resolves its implementation through the virtual table
Console.WriteLine(b.Name); // prints "Base"
New n = new New();
// type of `n` variable is `New`, and `New.Name` is not virtual,
// so compiler sees `n.Name` as a completely different property
Console.WriteLine(n.Name); // prints "New"
}
3. Резюме
Если часть вашего кода принимает базовый тип, она всегда будет использовать виртуальную таблицу во время выполнения. Для большинства сценариев ООП это означает, что пометка метода как new
очень похожа на присвоение ему совершенно другого имени.
4. Размеры объектов после создания
Обратите внимание, что создание любого из этих типов не создает копию виртуальной таблицы. Каждый .NET-объект имеет пару байтов заголовка и указатель на виртуальную таблицу таблицы своего типа (class
).
Что касается свойства new
(того, которое не является виртуальным), оно в основном компилируется как статический метод с семантикой thiscall, что означает, что он также ничего не добавляет к размеру экземпляра в памяти.
person
Groo
schedule
15.06.2012