Передача параметра как окончательного в C # - PullRequest
12 голосов
/ 16 апреля 2010

Это может быть дубликат вопроса. Но не удалось найти его в поиске В java, чтобы пометить параметр метода как константу, мы объявляем его как окончательный, что эквивалентно ключевому слову C #? Нравится

public void doSomeThing(final object myObject)
{
//print myobject
}

Ответы [ 6 ]

7 голосов
/ 16 апреля 2010

Это невозможно в C # - нет способа пометить переданный параметр как константу.

Если у вас есть const, который должен быть доступен для многих функций, почему бы не объявить его с правильной областью видимости (область видимости класса или глобальная, если необходимо)?

3 голосов
/ 16 апреля 2010

В C # 4.0 / Visual Studio 2010 с установленной надстройкой Code Contracts можно использовать Contract.Invariant в атрибуте ContractInvariantMethod, чтобы проверить, что значение не изменяется во время вызова метода.

Не совсем то же самое, но примерно так близко, как вы, я думаю.

3 голосов
/ 16 апреля 2010

В C # есть ключевое слово readonly, но пока мы можем применять его только к полям, а не к местным или параметрам.

Часто в Java ключевое слово final обычно используется как вопрос стиля, чтобы упростить закрытие значений в анонимных внутренних классах. Но эта проблема не существует в C #, поскольку анонимные методы / лямбды могут закрывать изменяемые переменные.

Также такие инструменты, как Resharper, могут отображать измененные переменные / параметры в другом цвете, чтобы вы могли сразу увидеть «сложности» в вашем методе. Я использую его, чтобы мутировавшие имена загорелись жирным зеленым текстом или что-то в этом роде!

Это не означает, что сам C # не будет улучшен многими другими функциями, такими как широко применяемый readonly, чтобы помочь с объявленной неизменностью. Но если у вас есть короткие методы и Resharper, чтобы выделить вещи для вас, то вам не нужно полностью объявлять вещи как final / readonly / const (в зависимости от языка). IDE отслеживает это для вас.

Это имеет больше смысла: как обнаружили Java-кодеры, большинство «переменных» вообще не являются переменными. Но если вам нужно объявить это, добавив final ко всему, это лишний шум в вашем коде. Было бы более разумно, если по умолчанию будет final и иметь ключевое слово, чтобы сделать вещи mutable. Вот как это работает в F #.

2 голосов
/ 16 апреля 2010

такого нет в c #

1 голос
/ 16 апреля 2010

Как уже говорили другие, в C # такого нет.

Если вы намерены запретить вызываемому методу изменять ваш объект (или точно знать, что это не так), вы можете передать глубокий клон вашего объекта, - Не очень элегантно, но единственный способ, чтобы быть уверенным.

1 голос
/ 16 апреля 2010

C # имеет ключевое слово только для чтения, но его нельзя использовать для локальных переменных (только для членов класса). Это означает, что нет способа пометить константу параметра metheod.

Я тоже скучаю по этому, потому что в моем Java-коде почти каждый параметр и локальная переменная являются окончательными (я считаю, что это хороший шаблон кодирования).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...