Это могло бы быть дублирующимся вопросом. Но не мог найти, что он в поиске В Java отметил параметр метода как постоянный, мы объявляем это как финал, каково эквивалентное ключевое слово C#? Как
public void doSomeThing(final object myObject)
{
//print myobject
}
Как утверждали другие, в C # такого нет.
Если вы намереваетесь запретить вызываемому методу изменять ваш объект (или знаете наверняка, что это не так), ваш единственный вариант - передать глубокий клон вашего объекта . - Не очень элегантно, но это единственный способ убедиться.
В C # 4.0 / Visual Studio 2010 с установленной надстройкой Code Contracts вы можете использовать Contract.Invariant в атрибуте ContractInvariantMethod, чтобы проверить, не соответствует ли значение изменяется во время вызова метода.
Не совсем то же самое, но примерно так близко, как вы думаете.
В C # есть ключевое слово readonly
, но пока мы можем применять его только к полям, а не к локальным или параметрам.
Часто в Java ключевое слово final
обычно используется как вопрос стиля, чтобы упростить закрытие значений в анонимных внутренних классах. Но этой проблемы не существует в C #, поскольку анонимные методы / лямбда-выражения могут закрывать изменяемые переменные.
Также такие инструменты, как Resharper, могут отображать измененные переменные / параметры другим цветом, чтобы вы могли сразу увидеть «сложности» в вашем методе. Я использую его, чтобы мутировавшие имена подсвечивались жирным зеленым шрифтом или что-то в этом роде!
Это не означает, что сам C # не будет улучшен множеством других функций, таких как широко применимый readonly
, чтобы помочь с заявленной неизменяемостью. Но если у вас есть короткие методы и Resharper, чтобы выделить что-то для вас, вам не нужно полностью вручную объявлять вещи как final / readonly / const (в зависимости от языка). IDE отслеживает это за вас.
Это имеет больше смысла: как обнаружили Java-программисты, большинство «переменных» вообще не являются переменными. Но если вам нужно объявить это, добавив ко всему final
, это будет лишним шумом от ключевых слов в вашем коде. Было бы разумнее использовать значение по умолчанию final
и иметь ключевое слово, чтобы сделать вещи изменяемыми
. Вот как это работает в F #.
В C # есть ключевое слово только для чтения, но его нельзя использовать для локальных переменные (только для членов класса). Это означает, что нет возможности пометить константу параметра metheod.
Я тоже скучаю по нему, потому что в моем Java-коде почти все параметры и локальные переменные являются окончательными (я считаю, что это хороший шаблон кодирования).
Это невозможно в C # - нет способа пометить переданный параметр как константу.
Если у вас есть const
, который должен быть доступен для многих функций, почему бы не объявить его с правильной областью действия (область действия класса или глобальная, если необходимо)?