Передача параметра как окончательного в С#
Это может быть дублированный вопрос. Но не смог найти его в поиске
В java, чтобы отметить параметр метода как константу, мы объявляем его окончательным, что эквивалентно ключевому слову С#?
Как
public void doSomeThing(final object myObject)
{
//print myobject
}
Ответы
Ответ 1
Это невозможно в С# - нет способа пометить переданный параметр как константу.
Если у вас есть const
, который должен быть доступен для многих функций, почему бы не объявить его с правильной областью охвата (например, для определения класса или глобального)?
Ответ 2
нет такой вещи в С#
Ответ 3
В С# есть ключевое слово readonly
, но до сих пор мы можем применять его только к полям, а не локалям или параметрам.
Часто в Java ключевое слово final
используется обычно как вопрос стиля, чтобы упростить закрытие значений в анонимных внутренних классах. Но эта проблема не существует в С#, поскольку анонимные методы /lambdas могут закрывать модифицируемые переменные.
Также такие инструменты, как Resharper, могут отображать измененные переменные/параметры в другом цвете, поэтому вы можете увидеть "осложнения" в вашем методе с первого взгляда. Я использую его, чтобы мутированные имена загорались жирным зеленым текстом или что-то в этом роде!
Это не означает, что сам С# не будет улучшен многими другими функциями, такими как широко применимый readonly
, чтобы помочь с объявленной неизменностью. Но если у вас есть короткие методы и Resharper, чтобы выделить вещи для вас, вам не нужно вручную объявлять вещи как final/readonly/const (в зависимости от языка). IDE отслеживает его для вас.
Это имеет смысл: поскольку Java-кодеры обнаружены, большинство "переменных" вообще не являются переменными. Но если вам нужно объявить об этом, добавив final
ко всему, что в вашем коде много лишнего шума. Было бы разумнее, если бы значение по умолчанию было final
и иметь ключевое слово для создания вещей mutable
. Вот как это работает в F #.
Ответ 4
В С# 4.0/Visual Studio 2010 с установленным надстройкой Code Contracts вы можете использовать Contract.Invariant в атрибуте ContractInvariantMethod, чтобы проверить, что значение не изменяется во время вызова метода.
Не совсем то же самое, но примерно так же близко, как вы думаете.
Ответ 5
С# имеет ключевое слово readonly, но не может быть использовано для локальных переменных (только для членов класса).
Это означает, что невозможно пометить константу параметра metheod.
Я пропустил это тоже, потому что в моем Java-коде почти каждый параметр и локальная переменная являются окончательными (что я считаю хорошим примером кодирования).
Ответ 6
Как утверждали другие, в С# такой вещи нет.
Если ваше намерение состоит в запретить вызываемому методу изменить ваш объект (или точно знать, что это не так), единственным вариантом является передать глубокий клон вашего объекта strong > . - Не очень элегантный, но единственный способ быть уверенным.
Ответ 7
Через 8 лет, когда этот вопрос был сделан. Есть способ отметить параметр const. in
ключевом слове работает отлично. Еще более сложно было оптимизировать структурированное копирование более удобным способом.