После C # 5 введены async
иawait
модель для асинхронного программирования, сообщество C # пришло к соглашению об именах, чтобы добавить суффикс "Async" к методам, возвращающим ожидаемый тип, например так:
interface Foo
{
Task BarAsync();
}
С тех пор было написано, что многие статические анализаторы кода (как на основе Roslyn, так и на основе Roslyn) зависят от этого соглашения об именах при обнаружении запаха кода вокруг асинхронного программирования.
Теперь, когда в C # 8 введена концепция асинхронных перечислимых элементов, которые сами по себе не являются ожидаемыми, но могут использоваться вместе с ними await foreach
, кажется, есть два варианта возврата методов именования IAsyncEnumerable
:
interface Foo
{
// No "Async" suffix, indicating that the return value is not awaitable.
IAsyncEnumerable<T> Bar<T>();
}
или
interface Foo
{
// With "Async" suffix, indicating that the overall logic is asynchronous.
IAsyncEnumerable<T> BarAsync<T>();
}
Существовало ли определенное руководство по соглашению об именах (от группы по языку C #, .NET Foundation или других авторитетов) в отношении описанных выше вариантов, например, как соглашение по именованию C # 5 было однозначно стандартизировано и не оставлено на усмотрение программистов?
async
и используйтеawait
внутри), и примерAsync
суффикс для методов, которые возвращаютIAsyncEnumerable
, например, ChannelReader.ReadAllAsync . В других случаях, например в EF Core,AsAsyncEnumerable()
используется уже ясноОтветы:
Нет лучшего руководства, чем то, что уже делают команды .NET :
IAsyncEnumerable<T>
IAsyncEnumerable
вызова AsAsyncEnumerable ()IAsyncEnumerable
sSystem.Linq.Async
сохраняют свои имена. Там нетSelectAsync
илиSelectAsAsyncEnumerable
простоSelect
.Во всех случаях ясно, каков результат метода. Во всех случаях результаты метода следует ожидать с
await foreach
прежде чем их можно будет использовать.Таким образом, реальная рекомендация остается прежней - убедитесь, что имя проясняет поведение :
AsAsyncEnumerable()
илиToAsyncEnumerable()
, нет необходимости добавлять суффикс.Async
суффикс, чтобы разработчики знали, что им нуженawait foreach
результат.Анализаторы и генераторы кода на самом деле не заботятся об именах методов, они обнаруживают запахи, проверяя сам код. Анализатор кода покажет вам , что вы забыли не ждать Задачу или независимо от того , как вы называете методы и переменные. Генератор может просто использовать отражение, чтобы проверить и испустить
await foreach
IAsyncEnumerable
IAsyncEnumerable
await foreach
Это анализаторы стиля, которые проверяют имена. Их работа заключается в обеспечении того, чтобы код использовал согласованный стиль, чтобы разработчики могли понимать код. Анализатор стиля скажет вам, что метод не соответствует выбранному вами стилю. Этот стиль может быть командным или общепринятым руководством по стилю.
И, конечно же, все знают, что общий префикс для полей частного экземпляра есть
_
:)источник
ChannelReader.ReadAllAsync
пример. Поскольку это исходит от команды .NET, трудно пойти не так, как следует.Это не асинхронный метод, поэтому имя не должно заканчиваться на «асинхронный». Этот суффикс метода является соглашением, позволяющим сделать очевидным, что метод следует ожидать или результат обрабатывается как задача.
Я думаю, что нормальное возвращающее коллекцию имя уместно. GetFoos () или аналогичный.
источник
Async
суффикса. Суффикс используется в самом .NET Ядро: ChannelReader.ReadAllAsync возвращает IAsyncEnumerable.IAsyncEnumerable
Должен быть использован сawait foreach
, поэтому суффикс имеет смысл.Асинхронный суффикс и даже ключевое слово
async
- это просто шаблон, он не имеет смысла, кроме некоторых аргументов обратной совместимости. C # имеет всю информацию, чтобы различать эти функции так же, как он различаетyield
методы, которые возвращаютIEnumerable
, поскольку вы знаете, что вам не нужно добавлять что-то вродеenumerable
или какое-либо другое ключевое слово в такие методы.Вам нужно добавить суффикс Async только потому, что C # будет жаловаться на перегрузки, поэтому, по сути, эти два идентичных и они делают одно и то же по всем правилам полиморфизма (если мы не принимаем во внимание человеческий фактор намеренно искажающего поведения):
Но вы не можете написать это так, потому что компилятор будет жаловаться. Но эй! Это поглотит это чудовище:
и даже это:
Вот и все. Вы добавляете Async, чтобы компилятор не жаловался. Не уточнять вещи. Чтобы не сделать их лучше. Если нет жалоб - нет причин добавлять их, поэтому в вашем случае я этого избегу, если только это не станет
Task<IAsyncEnumerable>
.PS: Просто для лучшего понимания всей картины здесь - если когда-нибудь в будущем кто-то добавит в C # расширения квантово-компьютерного метода (fantazy, да), которые будут работать в другой парадигме, нам, вероятно, понадобится другой суффикс, такой как Quant или что-то еще, потому что C # будет жаловаться иначе. Это будет точно такой же метод, но он будет работать по-другому. Так же, как и полиморфизм. Так же, как и интерфейсы.
источник