Возможно ли присвоить значение переменной const при создании объекта?

#c#

#c#

Вопрос:

Я создаю клиент для WebRequestTool, который содержит токен, который используется на протяжении всего срока службы каждого объекта, но уникален для каждой сущности класса. Поскольку я не хочу, чтобы это значение можно было изменять после создания объекта, я бы хотел, чтобы оно было постоянным.

Я уже пробовал использовать внутренний setMethod, который вызывается из конструктора, например :

 internal void setToken(string token)
{
    this.TOKEN = token; 
}
  

Я также пытался просто присвоить его внутри конструктора. Это тоже не работает.

 public class Client
{
    const TOKEN; 

    public client(string token)
    {
      this.TOKEN = token;
    }
}
  

Действительно ли нет другого способа присвоения константы, кроме ее жесткого кодирования при объявлении? И если есть, то что это?

Комментарии:

1. Как насчет использования readonly ?

2. Ох. Я не знал об этом, поскольку я довольно новичок в этом.

Ответ №1:

Из документации:

Поле const может быть инициализировано только при объявлении поля

Возможно, вместо этого вы захотите использовать только для чтения:

Поле, доступное только для чтения, может быть инициализировано либо при объявлении, либо в конструкторе. Следовательно, поля, доступные только для чтения, могут иметь разные значения в зависимости от используемого конструктора

Еще один приятный ресурс: Разница между ключевыми словами readonly и const в C #

Комментарии:

1. Есть ли способ сделать все это с помощью функции Set? Поскольку доступно только для чтения, также, похоже, доступно для записи только из конструктора.

2. @ArtisticAligator — как из установщика? В вашем случае вы не знаете, когда хотите его инициализировать, но хотите только один раз?

3. Нет, это было бы не из-за времени, которое я хочу его установить, а из-за сохранения понятного размера конструктора.

4. @ArtisticAligator что вы подразумеваете под «сохранением понятного размера конструктора»?

5. @ArtisticAligator — если он большой, то, вероятно, выполняет слишком много. Подумайте, могли бы вы использовать несколько ctors, где один вызывает другой. Если нет, то вы могли бы также создать некоторые частные функции и вызывать их из ctor. Тем не менее, я бы сказал, что если ctor делает так много, он, вероятно, делает то, чего не должен

Ответ №2:

Вы можете insted объявить его закрытым только для чтения

 public class Client
{
   private readonly string _token;

   public Client(string token)
   {
       _token = token;
   }
}
  

Поля, доступные только для чтения, не могут быть изменены после их установки и могут быть установлены в конструкторе.