Почему System.Version является ссылочным типом (классом), а не типом значения (структурой)?

Если я посмотрю на члены.NET-типа System.Version, возможно, было бы лучше создать такой тип, как тип значения (структура C#), а не ссылочный тип (класс).

Какие могут быть причины или аргументы, что Microsoft решила реализовать этот тип таким образом? Это просто своего рода "ошибка" / ошибка / несоответствие или "особенность" (другими словами: "действительно нужно и полезно")?

Существуют методы, такие как Parse() и TryParse(), которые типичны для типов значений, например System.Int32, System.Double или System.Guid. В свойствах System.Version хранятся только короткие и целочисленные значения (например, System.TimeSpan), сам тип сопоставим (с операторами), и в качестве структуры может не потребоваться сделать его клонируемым.

Я не имею ничего против этого "статус-кво", это только для удовлетворения моего любопытства;-)

РЕДАКТИРОВАТЬ: Добавлено сравнение с System.TimeSpan.

3 ответа

Решение

Согласно собственным рекомендациям Microsoft, вы должны предпочесть класс структуре, если размер экземпляра составляет не менее 16 байтов. поскольку System.Version хранит четыре Int32, каждый из которых состоит из четырех байтов, в общей сложности 16 байтов, они последовали собственному совету и сделали его классом.

Точно сказать не могу, но одной из причин может быть неизменность. Свойства в Version класс все только для чтения. В то время как можно объявить readonly Поля в структуре, Эрик Липперт указывает, что только чтение в поле структуры является ложью.

Создание этого класса гарантирует неизменность.

Еще один момент, который мог иметь отношение к процессу проектирования, заключается в том, что Version ComVisible.

Таким образом, более разумно представить его COM как кокласс (поведение без гарантий внутренней компоновки), а не как структуру COM (которая задает компоновку в памяти как структура C).

Другие вопросы по тегам