C# язык не есть, но .NET может быть.
по контрактам библиотека + статические средства анализа вводится в .NET 4 может ввести эти:
Microsoft использует [Неизменное] и [Pure] внутри .NET 3.5 рамки прямо сейчас.
Например, см. [Microsoft.Contracts.Immutable] и [Microsoft.Contracts.Pure] внутри .NET 3.5 в System.Core.dll. К сожалению, они внутренние. Однако Microsoft.Contracts. * В основном рождается из исследования SpeC#, а SpeC# была сложена в API контрактов, который будет частью .NET 4.0.
Мы посмотрим, что из этого получилось. Я не проверял, не содержат ли в предварительных версиях .NET 4.0 битов любые API, такие как [Pure] или [Immutable] в API контрактов. Если они это сделают, я бы предположил, что инструмент статического анализа будет тем, чтобы обеспечить соблюдение правила, а не компилятора.
Редактировать Я только что загрузил Microsoft.Contracts.dll с latest pre-release drop of MS Code Contracts на этой неделе. Хорошие новости: в библиотеке существуют атрибуты [Pure] и [Mutability (Mutability.Immutable)], которые предполагают, что они будут в .NET 4.0. Woohoo!
Редактировать 2 Теперь, когда .NET 4 был выпущен, я просмотрел эти типы. [Pure] все еще присутствует в System.Diagnostics.Contracts namespace. Он не предназначен для общего использования, а скорее для использования с проверкой до и после условия контракта API. Он не является компилятором, neither does the Code Contract checker tool enforce purity. [Mutability] ушел. Интересно, что, когда Microsoft использовала атрибуты Mutability и Pure в .NET 3.5 (во внутреннем классе BigInteger в System.Core.dll), .NET 4 переместил BigInteger в System.Numerics и лишил [Pure] и [Mutability] атрибуты этого типа. Нижняя строка: появляется .NET 4 ничего не делает для проверки побочных эффектов.
редактировать 3 С недавнего времени (в конце 2011) просмотров Microsoft Rosyln компилятором как услуга инструменты - как полагают, запланировано на RTM в Visual Studio 2015 - выглядеть они будут в состоянии поддерживать такие вещи; вы можете написать расширения компилятору, чтобы проверить чистоту и неизменность, а также выдавать предупреждения компилятора, если что-то, украшенное этими атрибутами, не соответствует правилам. Несмотря на это, мы смотрим на несколько лет, чтобы поддержать это.
Редактировать 4 Теперь, когда Rosyln существует с лета 2015 года, способность создавать расширение компилятора для чистой/неизменяемости действительно существует. Тем не менее, это ничего не делает для существующего кода рамки, а также для стороннего библиотечного кода. Но на горизонте находится C# 7 proposal for immutable types. Это будет принудительно применено компилятором и введет новое ключевое слово неизменным в C# и атрибут [Неизменяемый] в платформе .NET. Использование:
// 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.
}
редактировать 5 Это ноября 2016, и, кажется, неизменные типы были исключены из C# 7. Там всегда есть надежда на C# 8. :-)
редактировать 6 Это ноября 2017. C# 8 выходит на первый план, и пока у нас не будет чистых функций, у нас будет readonly structs. Это делает структуру неизменной, что позволяет несколько оптимизаций компилятора.
Другое примечание: начиная с этой недели, [Pure] является общедоступным, но [Mutability (...)] является внутренним. Посмотрим, изменится ли это. –
Следует также отметить, являются ли эти атрибуты для общего использования или предназначены только для использования в API контрактов. Я надеюсь, что они, как правило, полезны для использования на всей кодовой базе, независимо от того, используется ли в ней фактический System.Diagnostics.Contract API. –
+1 для обновления ответа на древний вопрос, когда мир изменился. – Emile