"Нормальное" преобразование типов ссылок вверх и вниз
Для ссылочных типов приведение переменных не изменяет тип объекта, уже размещенного в куче, а просто влияет на тип переменной, которая ссылается на объект.
Так что нет, нет никаких дополнительных накладных расходов на кучу при приведении ссылочных типов (т.е. экземпляров объектов из классов).
Рассмотрим следующую иерархию классов:
public class Fruit
{
public Color Colour {get; set;}
public bool Edible {get; set;}
}
public class Apple : Fruit
{
public Apple { Color = Green; Edible = true; KeepsDoctorAtBay = true;}
public bool KeepsDoctorAtBay{get; set;}
}
Что при использовании как с повышением, так и с понижением:
В куче всегда есть только одно выделение, которое является начальным var foo = new Apple()
.
После различных назначений переменных все три переменные, foo
, bar
и baz
, указывают на один и тот же объект (экземпляр Apple
в куче).
Восходящее преобразование (Fruit bar = foo
) просто ограничит доступный доступ к переменной только Fruit
методами и свойствами, и если (Apple)bar
преобразование вниз будет успешным, все методы, свойства и события типа нижнего преобразования будут доступны для переменной. Если приведение вниз завершится неудачно, будет выброшено InvalidCastException
, так как система типов проверит совместимость типа объекта кучи с типом переменной во время выполнения.
Операторы преобразования
Согласно комментарию tolanj, все ставки на кучу отключены, если оператор явного преобразования заменяет стандартное приведение ссылочных типов.
Например, если мы добавим несвязанный класс:
public class WaxApple // Not inherited from Fruit or Apple
{
public static explicit operator Apple(WaxApple wax)
{
return new Apple
{
Edible = false,
Colour = Color.Green,
KeepsDoctorAtBay = false
};
}
}
Как вы понимаете, explicit operator Apple
от WaxApple может делать все, что захочет, в том числе размещать новые объекты в куче.
var wax = new WaxApple();
var fakeApple = (Apple)wax;
// Explicit cast operator called, new heap allocation as per the conversion code.
person
StuartLC
schedule
20.11.2017