Передача параметра как окончательного в С#

Это может быть дублированный вопрос. Но не смог найти его в поиске В 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 ключевом слове работает отлично. Еще более сложно было оптимизировать структурированное копирование более удобным способом.