почему const не может быть статическим в c #? [Дубликат]

ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.

function* myGenerator() {
    const callback = yield;
    let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
    console.log("response is:", response);

    // examples of other things you can do
    yield setTimeout(callback, 1000);
    console.log("it delayed for 1000ms");
    while (response.statusText === "error") {
        [response] = yield* anotherGenerator();
    }
}

Для запуска вышеуказанного кода вы делаете это:

const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function

Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.

Обратный вызов ...args завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :

const [err, data] = yield fs.readFile(filePath, "utf-8", callback);

80
задан leppie 24 February 2015 в 08:20
поделиться

5 ответов

const подразумевает static (вам не нужен экземпляр для ссылки на значение const).

Я хочу также добавить этот важный момент: когда вы ссылаетесь на (ссылку) на сборку с public const, это значение копируется в вашу сборку. Поэтому, если значение const в ссылочной сборке изменяется, ваша сборка будет по-прежнему иметь исходное скомпилированное значение.

Если это поведение не приемлемо, тогда вы должны рассмотреть создавая поле a public static readonly.

Lib.dll, представленный как двоичный:

public class Foo {
    public const int HATS = 42;
    public static readonly int GLOVES = 33;
}

App.exe, ссылки Lib .dll:

Foo.HATS    // This will always be 42 even if the value in Lib.dll changes,
            // unless App.exe is recompiled.

Foo.GLOVES  // This will always be the same as Foo.GLOVES in Lib.dll

Из MSDN :

Не создавайте константу для представления информации, которая вы ожидаете изменения в любое время. Например, не используйте постоянное поле для хранения цены на услугу, номер версии продукта или фирменное наименование компании. Эти значения могут меняться со временем, а поскольку компиляторы распространяют константы, другой код, скомпилированный с вашими библиотеками, должен быть перекомпилирован для просмотра изменений.

Из DotNetPerls :

DLL. Когда вы используете поле или объявление const, компилятор C # фактически вводит значение переменной const непосредственно в код IL. Следовательно, он по существу стирает const как отдельный объект.

Внимание: если программы, зависящие от const, не перекомпилируются после изменения значения const, они могут сломаться [ потому что они будут продолжать использовать предыдущее значение ].

168
ответ дан Jonathon Reinhart 26 August 2018 в 09:25
поделиться

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

4
ответ дан Daniel Becroft 26 August 2018 в 09:25
поделиться

У вас не может быть static const. Попробуйте readonly вместо const или просто отбросьте «статический», поскольку «const» все равно подразумевается как статический.

9
ответ дан itsme86 26 August 2018 в 09:25
поделиться

Константа по определению статична.

11
ответ дан juergen d 26 August 2018 в 09:25
поделиться

Все объявления констант неявно статичны, а спецификация C # заявляет, что (избыточное) включение статического модификатора запрещено. Я считаю, что это необходимо для того, чтобы избежать путаницы, которая могла возникнуть, если бы читатель увидел две константы, один из которых был объявлен статичным, а другой нет - они могли легко предположить, что разница в спецификации подразумевала разницу в семантике. Сказав это, нет запрета на избыточное определение модификатора доступа, который также является стандартным, где есть выбор. Например, метод (конкретный) может быть явно помечен как закрытый, несмотря на то, что это значение по умолчанию. Правило, по-видимому, заключается в том, что там, где нет выбора (например, объявление метода в интерфейсе), избыточный модификатор запрещен. Там, где есть выбор, это разрешено.

3
ответ дан Mohit Malik 26 August 2018 в 09:25
поделиться
Другие вопросы по тегам:

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