Подтвердить что ты не робот

Все приведения С# приводят к боксу/распаковке

Мне любопытно узнать, все ли приведения в С# приводят к боксу, а если нет, все ли это дорогостоящая операция?

Пример из Бокс и Unboxing (Руководство по программированию на С#)

    int i = 123;
    // The following line boxes i.
    object o = i;  

Эта строка, очевидно, вызывает бокс (завершение типа int как объекта). Это операция, которая считается дорогостоящей, поскольку она создает мусор, который будет собран.

Как насчет отливок из двух типов типов ссылок? Какова стоимость этого? можно ли его правильно измерить? (по сравнению с предыдущим примером)

Например:

public class A
{
}

public class B : A
{
}

var obj = new B();
var obj2 = (A)obj; // is this an "expensive" operation? this is not boxing
4b9b3361

Ответ 1

Мне любопытно узнать, все ли преобразования в С# приводят к боксу.

Нет. Только бокс-преобразования приводят к боксу, отсюда и название "конверсии бокса". Конверсии бокса - это все встроенные преобразования от типов значений к ссылочным типам - либо к классу, на который наследуется тип значения, либо к интерфейсу, который он реализует. (Или интерфейсу, совместимому с интерфейсом, который он реализует, посредством ковариантного или контравариантного преобразования ссылок.)

все конверсии являются дорогостоящей операцией?

Нет. Преобразования идентичности - это нулевая стоимость, потому что компилятор может полностью их исключить.

Каковы затраты на неявные и явные ссылочные преобразования?

Неявные ссылочные преобразования - это нулевая стоимость. Компилятор может полностью исключить их. То есть преобразование из Жирафа в его базовый тип Animal или Giraffe в его реализованный тип интерфейса IAmATallMammal бесплатны.

Явные преобразования ссылок включают проверку времени выполнения, чтобы убедиться, что ссылка действительно ссылается на объект требуемого типа.

Независимо от того, является ли эта проверка времени выполнения "дорогостоящей" или нет, зависит от вашего бюджета.

может ли это быть правильно измерено?

Конечно. Решите, какой ресурс вам подходит - время, скажем - и затем тщательно измерьте потребление времени секундомером.

Вопрос, который вы не спрашивали, но, вероятно, должен иметь:

Каковы наиболее дорогие преобразования?

Пользовательские преобразования - это не что иное, как синтаксический сахар для вызова метода; этот метод может принимать сколь угодно долго, как и любой метод.

Динамические преобразования снова запускают компилятор во время выполнения; компилятор может занять много времени, чтобы выполнить анализ типа, в зависимости от того, насколько сложно решить проблему анализа, которую вы выбрали для этого.

Ответ 2

Нет.

Бокс означает перенос значения в новый экземпляр ссылочного типа.

Стандартные отбрасывания между ссылочными типами не приводят к каким-либо выделениям.
(Пользовательские приведения могут делать что угодно)

Ответ 3

Мне любопытно узнать, попадают ли все броски в С# в бокс,

Нет. Бокс - это особая операция которая означает обработку экземпляра типа значения в качестве экземпляра ссылочного типа. Для преобразования ссылочного типа в преобразование ссылочного типа концепция не играет никакой роли.

все выполняются дорогостоящие операции?

Короткий ответ: Нет.

Длинный ответ: Определите дорогостоящий. Тем не менее, нет.

Как насчет отливок из двух типов типов ссылок? какова стоимость этого?

Ну, что, если это просто преобразование базовой ссылки? Это ОЧЕНЬ быстро, потому что ничего не происходит.

Другие, определяемые пользователем преобразования, могут быть "медленными", они могут быть "быстрыми".

Этот "медленный".

class A { public int Foo { get; set; } }
class B {
    public int Foo { get; set; }
    static Random rg = new Random();
    static explicit operator A(B b) {
        Thread.Sleep(rg.Next());
        return new A { Foo = b.Foo; }
    }
}

Этот "быстрый".

class A { public int Foo { get; set; } }
class B {
    public int Foo { get; set; }
    static Random rg = new Random();
    static explicit operator A(B b) {
        return new A { Foo = b.Foo; }
    }
}

var obj2 = (A)obj;//Это "дорогая" операция? это не бокс

Нет, это "дешево".