C # язык не такой, но .NET может быть фреймворком.
Библиотека контрактов + инструменты статического анализа, представленные в .NET 4, могли бы представить их так:
Microsoft использует [Immutable] и [Pure] внутри .NET 3.5 framework прямо сейчас.
Например, см. [Microsoft.Contracts.Immutable] и [Microsoft.Contracts.Pure] внутри .NET 3.5 в System.Core.dll. К сожалению, они внутренние. Однако Microsoft.Contracts. * В основном создан на основе исследований Spec #, а Spec # был добавлен в API-интерфейсы Contracts, которые станут частью .NET 4.0.
Посмотрим, что из этого выйдет. Я не проверял, содержат ли биты .NET 4.0, выпущенные до выпуска, какие-либо API-интерфейсы, такие как [Pure] или [Immutable] в API-интерфейсах Contracts. Если они это сделают, я бы предположил, что инструмент для статического анализа будет применять правило, а не компилятор.
edit Я только что загрузил Microsoft.Contracts.dll из последней предварительной версии MS Code Contracts на этой неделе. Хорошие новости: атрибуты [Pure] и [Mutability (Mutability.Immutable)] существуют в библиотеке, что говорит о том, что они будут в .NET 4.0. Woohoo!
edit 2 Теперь, когда вышел .NET 4, я посмотрел эти типы. [Pure] все еще существует в пространстве имен System.Diagnostics.Contracts. Он не предназначен для общего использования, а скорее для использования с API-интерфейсом Контракта до и после проверки условий. Он не применяется компилятором, и инструмент проверки контрактного кода не обеспечивает чистоту . [Изменчивость] исчезла. Интересно, что когда Microsoft использовала атрибуты Mutable и Pure в .NET 3.5 (во внутреннем классе BigInteger в System.Core.dll), .NET 4 переместил BigInteger в System.Numerics и удалил [Pure] и [Mutable] атрибуты этого типа. Итог: кажется, что .NET 4 ничего не делает для проверки побочных эффектов.
edit 3 С недавно выпущенными (в конце 2011 года) инструментами компилятора как службы Microsoft Rosyln, которые, как предполагается, запланированы для RTM в Visual Studio 2015, похоже, они смогут поддерживать такие вещи; Вы можете написать расширения для компилятора, чтобы проверить чистоту и неизменность, и выдавать предупреждения компилятора, если что-то, украшенное этими атрибутами, не следует правилам. Тем не менее, мы рассчитываем на несколько лет, чтобы поддержать это.
edit 4 Теперь, когда Rosyln находится здесь летом 2015 года, возможность создания расширения компилятора для чистой / неизменяемости действительно существует. Тем не менее, это ничего не делает для существующего кода фреймворка или кода сторонней библиотеки. Но на горизонте предложение C # 7 для неизменяемых типов . Это будет выполняться компилятором и введет новое ключевое слово immutable для C # и атрибут [Immutable] в .NET Framework. Использование:
// Edit #4: This is a proposed design for C# 7 immutable as of June 2015.
// Compiler will implicitly mark all fields as readonly.
// Compiler will enforce all fields must be immutable types.
public immutable class Person
{
public Person(string firstName, string lastName, DateTimeOffset birthDay)
{
FirstName = firstName; // Properties can be assigned only in the constructor.
LastName = lastName;
BirthDay = birthDay;
}
public string FirstName { get; } // String is [Immutable], so OK to have as a readonly property
public string LastName { get; }
public DateTime BirthDay { get; } // Date is [Immutable] too.
}
edit 5 Это ноябрь 2016 года, и кажется, что неизменяемые типы были удалены из C # 7. Всегда есть надежда для C # 8.: -)
edit 6 Это ноябрь 2017 года. C # 8 выходит в полноэкранный режим, и хотя у нас не будет чистых функций, у нас будет структуры только для чтения . Это делает структуру неизменной, что позволяет несколько оптимизаций компилятора.