Передающий параметр как финал в C#

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

public void doSomeThing(final object myObject)
{
//print myobject
}
13
задан Ravisha 14 July 2010 в 13:43
поделиться

6 ответов

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

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

1
ответ дан 1 December 2019 в 23:31
поделиться

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

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

3
ответ дан 1 December 2019 в 23:31
поделиться

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

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

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

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

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

3
ответ дан 1 December 2019 в 23:31
поделиться

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

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

1
ответ дан 1 December 2019 в 23:31
поделиться

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

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

8
ответ дан 1 December 2019 в 23:31
поделиться

в C #

2
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

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