(Или будет), C# включать функции проверки побочных эффектов?

Вы должны убежать от новых строк. В этом случае вы можете просто сделать его необработанным строковым литералом:

python_text = r"""
@commands.command()
def multi():
    print("Three\nLines\nHere")
"""

print(python_text.splitlines())
>>>['', '@commands.command()', 'def multi():', '    print("Three\\nLines\\nHere")']
72
задан DaveInCaz 21 June 2018 в 14:24
поделиться

3 ответа

C#, который язык не, но.NET платформа, может быть.

библиотека Contracts + инструменты статического анализа, представляемые в.NET 4, могли бы представить их:

Microsoft использует [Неизменную] и [Чистую] внутреннюю.NET 3,5 платформы прямо сейчас.

, Например, посмотрите [Microsoft. Контракты. Неизменный] и [Microsoft. Контракты. Чистый] в.NET 3.5, в System.Core.dll. К сожалению, они являются внутренними. Однако Microsoft. Контракты.* главным образом подтвержден исследования Spec#, и Spec# был свернут в API Контрактов, которые будут частью.NET 4.0.

Мы будем видеть то, что вышло из этого. Я не проверил, чтобы видеть, содержит ли предрелизная.NET 4,0 бита какие-либо API как [Чистый] или [Неизменный] в API Контрактов. Если бы они делают, я предположил бы, что инструмент статического анализа будет тем для осуществления правила, а не компилятора.

редактирование я просто загрузил Microsoft.Contracts.dll из последнее предрелизное отбрасывание Контрактов Кода MS на этой неделе. Хорошие новости: [Чистый] и [Переменчивость (Переменчивость. Неизменный)] атрибуты существуют в библиотеке, которая предполагает, что они будут в.NET 4.0. Woohoo!

редактирование 2 Теперь, когда.NET 4 была выпущена, я искал эти типы. [Чистый] находится все еще там в Системе. Диагностика. Пространство имен контрактов. Это не предназначается для общего использования, а скорее, для использования с API Контракта пред - и проверка постусловия. Это не осуществленный компилятор, ни один не делает инструмент средства проверки Контракта Кода, осуществляют чистоту . [Переменчивости] не стало. Интересно, где Microsoft использовала Переменчивость и Чистые атрибуты в.NET 3.5 (во внутреннем классе BigInteger в System.Core.dll).NET 4 переместила BigInteger в Систему. Численные данные, и разделили [Чистые] атрибуты и [Переменчивость] атрибуты от того типа. Нижняя строка: кажется, что.NET 4 ничего не делает для проверки побочных эффектов.

редактирование 3 С недавно (в конце 2011) предварительно просмотрело Microsoft Rosyln compiler-as-a-service инструменты - полагавший быть запланированным для RTM в Visual Studio, на которую похож 2015 - они будут в состоянии поддерживать материал как это; Вы могли записать расширения компилятора, чтобы проверить на чистоту и неизменность, и выпустить предупреждения компилятора, если что-то украшенное теми атрибутами не следует правилам. Несмотря на это, мы смотрим на несколько лет для поддержки этого.

редактирование 4 Теперь, когда Rosyln здесь по состоянию на лето 2015 года, способность создать расширение компилятора для чистого / неизменности действительно существует. Однако это ничего не делает для существующего кода платформы, ни стороннего кода библиотеки. Но на горизонте предложение C# 7 по неизменным типам . Это было бы осуществлено компилятором и представит новое неизменный ключевое слово к 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 входит в полное представление, и в то время как у нас не будет чистых функций, мы будем иметь структуры только для чтения . Это делает структуру неизменной, который позволяет несколько оптимизации компилятора.

165
ответ дан Judah Gabriel Himango 24 November 2019 в 12:30
поделиться

Мало того, что нет ничего для проверки побочного эффекта - нет ничего даже, чтобы проверить, что тип неизменен, который является меньшим шагом вдоль того же маршрута IMO.

я не полагаю, что существует что-либо снижающееся канал в C# 4.0 (хотя я мог легко быть неправым). Я действительно надежда , что неизменность оказывает влияние в C# 5.0; конечно, Eric Lippert вел блог вполне немного об этом, и люди в MS думали о параллелизме изрядное количество.

Жаль это не более ободрительное изображение.

Редактирование: ответ Иудейского царства значительно более ярок..., поддержка платформы была бы достаточно хороша для Вас?:) (я не был бы полностью удивлен, не были ли некоторые аспекты Контрактов Кода готовы к.NET 4.0, обратите внимание - если, возможно, они сохранили первоначальную версию относительно маленькой и повысили ее позже.)

18
ответ дан Community 24 November 2019 в 12:30
поделиться

В принципе, проверка, является ли что-то неизменным & недостает ли коду, побочные эффекты легко. Все поля класса/структуры данных должны быть только для чтения, и их тип должен быть другим неизменным объектом. Нам также был бы нужен путь к маркировке делегата как "чистый" (бесплатный побочный эффект), но это, вероятно, все будет возможно.

Однако проблема состоит в том, что это часто слишком строго. В F# Вы обычно писали бы код в побочном эффекте свободный & неизменный стиль, но часто выгодно использовать некоторую мутацию локально. Это не повреждает полную чистоту (в некотором смысле) и делает намного легче написать код. Однако проверка этого автоматически является трудной (подразумевать, что это - интересная теоретическая проблема..)

, Например, это прекрасно подходит для работы с массивами "чистым" способом. У Вас могут быть методы как Array.map, которые применяют некоторую функцию ко всем элементам и возвращаются новый массив, не изменяя исходный. Функция видоизменяется (недавно созданный) массив прежде, чем возвратить его, но массив не видоизменен больше нигде, таким образом, это в принципе чисто , но трудно проверить (и это - довольно полезный шаблон программирования в F#).

Так, я думаю, что существует много, который мог быть сделан, но просто запрещающий все побочные эффекты может не быть как хороший путь, как это, кажется. Хорошая вещь о контрактах состоит в том, что они могли, вероятно, использоваться в этом сценарии также.

15
ответ дан Tomas Petricek 24 November 2019 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: