Объекты const (как в C++) в C#

Есть ли лучший способ иметь C++ - как объекты const в C#, чем кодировать все проверки самостоятельно?

Я знаю, что могу сделать это:

readonly Whatever a = new Whatever();

Но это не мешает вам переназначить a, это не мешает вам изменениеa:

a = new Whatever(); // nope
a.some_property = 5; // still possible, if property exists and has a setter

Я не хочу, чтобы всеWhatever были постоянными (в значении c), мне просто нужны некоторые.

Утомительный подход был бы таким:

public class Whatever
{
    private bool _isConst;
    private int _some_property = 0;
    public Whatever(isConst = false)
    {
        _isConst = isConst;
    }
    public int some_property
    {
        get {return _some_property;}
        set
        {
            if (_isConst)
                Debug.Assert(" ... ");
            _some_property = value;
        }
    }
}

Есть ли лучший способ сделать это?

Как следует из комментариев, я не очень четко выразился:

В C++ и в C#:

* const -> только чтение

#ОПРЕДЕЛЯТЬ -> const

const (*) -> ???

вы можете использовать ключевое слово const

preciousbetine 23.11.2018 19:29

@preciousbetine: нет, ты не можешь делать const Whatever a = new Whatever();

rhavin 23.11.2018 19:39

Вы хотите иногда иметь значение const, а иногда нет в том же классе?

Kevin Kouketsu 23.11.2018 19:44

@KevinKouketsu Нет, я хочу (как в C) иметь постоянные объекты и изменяемые объекты из одного и того же класса. Желательно без написания двух классов или воспроизведения компилятора путем кодирования всего того, что компилятор делает с const (на C) на C#.

rhavin 23.11.2018 19:46

С помощью свойств вы можете объявить общедоступный get {} частный набор {}. Этого достаточно?

Wyck 23.11.2018 20:01

@Wyck Нет: «Я не хочу, чтобы все Whatevers были постоянными (в значении c), мне просто нужны некоторые».

rhavin 23.11.2018 20:05

@Wyck: Как насчет того, чтобы сделать ваш класс Whatever неизменяемым, как предлагает Вик?

Robert Harvey 23.11.2018 20:06

Вы можете предоставить интерфейс, который разрешает доступ к объекту только для чтения. Рассмотрим ReadOnlyCollection <T>. Тогда ваш доступ («константный» или нет) определяется тем, какой у вас интерфейс к объекту. Было бы нормально?

Wyck 23.11.2018 20:07

Вы читали старую статью про Неизменяемость в C#? Это может помочь вам определиться с подходом.

Wyck 23.11.2018 20:17

@Wyck по статье мне нужен Наблюдательная неизменность:. Как я и просил: C-подобная const (возможно, с некоторыми изменяемыми полями).

rhavin 23.11.2018 20:24

Просто перестаньте относиться к C# как к C++, от этого далеко не уедешь. У const в C++ есть ужасные недостатки с const_cast <> и mutable и без фактического применения во время выполнения, а также значительное количество программистов, которые отказались от этого, потому что не могли понять это. Он был намеренно исключен из CLR и C#. Многие программисты на C# счастливо живут без перерыва. Ну все они :)

Hans Passant 23.11.2018 20:56

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

Peter - Reinstate Monica 23.11.2018 21:05

@HansPassant Удивительное заявление для меня, но исходящее от вас, должно быть, заслуживает внимания. В моей книге const была хорошей вещью, будь то принудительное исполнение или нет, потому что она заявляет о намерении программиста. «Только к сведению». Это тем более важно в таком языке, как C#, который передает почти все (без атомарных и других тривиальных типов) по ссылке и в то же время не имеет надлежащей поддержки «конструктора копирования».

Peter - Reinstate Monica 23.11.2018 21:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
78
0

Другие вопросы по теме