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

Накладные расходы на использование структур как оболочек для примитивов для проверки типов?

Скажем, я хочу получить дополнительную проверку типов для работы с примитивами, которые подразумевают разные вещи семантически:

public struct Apple
{
    readonly int value;

    // Add constructor + operator overloads
}

public struct Orange
{
    readonly int value;

    // Add constructor + operator overloads
}

Суть в том, что мы не можем сравнивать "яблоки с апельсинами", поэтому обертывание фактического int в структуре означает, что мы получаем проверку типов и некоторую дополнительную читаемость и документацию по коду.

Мой вопрос: каковы накладные расходы, связанные с этим, как с точки зрения памяти, так и с точки зрения скорости? Поскольку structs являются типами значений, будут ли переменные, содержащие эти структуры, 32 бита или больше? Что касается служебных издержек использования этих структур вместо примитивов - есть ли большие накладные расходы для перегрузки оператора?

Любые другие советы по мудрости этого?

4b9b3361

Ответ 1

В памяти нет накладных расходов, используя структуру, которую вы можете проверить с помощью Marshal.SizeOf():

struct testStruct
{
    public readonly int value;
}
..

int size = Marshal.SizeOf(typeof(testStruct)); //returns 4

Это также то же самое, что возвращается sizeof(testStruct):

unsafe
{
    int size = sizeof(testStruct); //returns 4
}

В соответствии с MSDN разница между двумя методами калибровки:

Хотя вы можете использовать Marshal.SizeOf метод, значение возвращенный этим методом, не всегда то же самое, что и значение, возвращаемое размер. Marshal.SizeOf возвращает размер после того, как тип был marshaled, тогда как sizeof возвращает размер, который был выделен времени выполнения общего языка, включая любые обивка.

Ответ 2

Я, вероятно, избегу этого, но вы могли бы сделать:

using Apple = System.Int32;
using Orange = System.Int32;

Вы не сможете использовать его в файлах. И технически вы можете сравнить яблоки с апельсинами.