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);
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 :
Не создавайте константу для представления информации, которая вы ожидаете изменения в любое время. Например, не используйте постоянное поле для хранения цены на услугу, номер версии продукта или фирменное наименование компании. Эти значения могут меняться со временем, а поскольку компиляторы распространяют константы, другой код, скомпилированный с вашими библиотеками, должен быть перекомпилирован для просмотра изменений.
blockquote>Из DotNetPerls :
DLL. Когда вы используете поле или объявление
const
, компилятор C # фактически вводит значение переменнойconst
непосредственно в код IL. Следовательно, он по существу стираетconst
как отдельный объект.Внимание: если программы, зависящие от
blockquote>const
, не перекомпилируются после изменения значенияconst
, они могут сломаться [ потому что они будут продолжать использовать предыдущее значение ].
Константы не могут быть заменены в коде во время компиляции, а не во время выполнения, поэтому нет необходимости в определении статических vs-экземпляров.
У вас не может быть static const. Попробуйте readonly вместо const или просто отбросьте «статический», поскольку «const» все равно подразумевается как статический.
Все объявления констант неявно статичны, а спецификация C # заявляет, что (избыточное) включение статического модификатора запрещено. Я считаю, что это необходимо для того, чтобы избежать путаницы, которая могла возникнуть, если бы читатель увидел две константы, один из которых был объявлен статичным, а другой нет - они могли легко предположить, что разница в спецификации подразумевала разницу в семантике. Сказав это, нет запрета на избыточное определение модификатора доступа, который также является стандартным, где есть выбор. Например, метод (конкретный) может быть явно помечен как закрытый, несмотря на то, что это значение по умолчанию. Правило, по-видимому, заключается в том, что там, где нет выбора (например, объявление метода в интерфейсе), избыточный модификатор запрещен. Там, где есть выбор, это разрешено.