Есть ли лучший способ иметь 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 (*) -> ???
@preciousbetine: нет, ты не можешь делать const Whatever a = new Whatever();
Вы хотите иногда иметь значение const, а иногда нет в том же классе?
@KevinKouketsu Нет, я хочу (как в C) иметь постоянные объекты и изменяемые объекты из одного и того же класса. Желательно без написания двух классов или воспроизведения компилятора путем кодирования всего того, что компилятор делает с const (на C) на C#.
С помощью свойств вы можете объявить общедоступный get {} частный набор {}. Этого достаточно?
@Wyck Нет: «Я не хочу, чтобы все Whatevers были постоянными (в значении c), мне просто нужны некоторые».
@Wyck: Как насчет того, чтобы сделать ваш класс Whatever неизменяемым, как предлагает Вик?
Вы можете предоставить интерфейс, который разрешает доступ к объекту только для чтения. Рассмотрим ReadOnlyCollection <T>. Тогда ваш доступ («константный» или нет) определяется тем, какой у вас интерфейс к объекту. Было бы нормально?
Вы читали старую статью про Неизменяемость в C#? Это может помочь вам определиться с подходом.
@Wyck по статье мне нужен Наблюдательная неизменность:. Как я и просил: C-подобная const (возможно, с некоторыми изменяемыми полями).
Просто перестаньте относиться к C# как к C++, от этого далеко не уедешь. У const в C++ есть ужасные недостатки с const_cast <> и mutable и без фактического применения во время выполнения, а также значительное количество программистов, которые отказались от этого, потому что не могли понять это. Он был намеренно исключен из CLR и C#. Многие программисты на C# счастливо живут без перерыва. Ну все они :)
Я полагаю, вы могли бы определить структуру (тип значения) вместо класса и объявить некоторые ее экземпляры только для чтения.
@HansPassant Удивительное заявление для меня, но исходящее от вас, должно быть, заслуживает внимания. В моей книге const была хорошей вещью, будь то принудительное исполнение или нет, потому что она заявляет о намерении программиста. «Только к сведению». Это тем более важно в таком языке, как C#, который передает почти все (без атомарных и других тривиальных типов) по ссылке и в то же время не имеет надлежащей поддержки «конструктора копирования».





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