Как использовать const в конструкторе класса C # - PullRequest
0 голосов
/ 08 июля 2019

Допустим, у меня есть такой класс:

public class SampleClass
{
    const string UnChangableUserName { get; private set; }
    string Password { get; private set; }

    public SampleClass(string UnChangableUserName, string Password)
    {
        this.Password = Password;
        this.UnChangableUserName = UnChangableUserName;
    }
}

Я хочу, чтобы конструктор присваивал значение const, а не то значение, которое будет установлено при определении const.Как мне это сделать?

Я знаю, что я просто не могу использовать набор, но использование const более эффективно с точки зрения ресурсов и более элегантно, а также понятнее для других разработчиков, я не хочу набор, поэтому они не будут его добавлять.

Ответы [ 2 ]

8 голосов
/ 09 июля 2019

Вы не можете.По определению, const s в C # определены в во время компиляции , а не во время выполнения.Они не могут быть изменены никаким кодом, даже кодом конструктора, потому что они даже не там во время выполнения - они заменяются своими литеральными значениями в каждой точке использования.

Вам нужно либо readonly fields, либо read only properties.

  1. Только для чтения поля помечаются модификатором readonly:

    private readonly string _username;

    Поля только для чтения присваиваются только во время построения, либо непосредственно назначаются в самом определении (readonly string _username = "blah") или в конструкторе.Компилятор будет применять это ограничение и не позволит вам устанавливать значение где-либо еще.

  2. Свойства только для чтения - это просто свойства, которые вообще не предоставляют установщика.До C # 6 вы могли использовать их для возврата значения поля только для чтения (как указано выше), но вы не могли назначить их.Начиная с C # 6, существует синтаксис, поддерживающий автоматические свойства только для чтения, которые могут быть назначены: даже если нет явного установщика, существует неявный установщик, который, опять же, может быть вызван только из конструктора или из инициализатора поля:

    public string Username { get } = "Username";

    Может показаться странным, что вы устанавливаете свойство без установщика, но это просто неявная часть языка - есть неявное поле поддержки, которое readonly и может быть установлен при инициализации.

1 голос
/ 09 июля 2019

const является константой при компиляции. Вам нужно свойство только для чтения.

https://stackoverflow.com/a/3917886/910741

...