Почему 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).