Конструктор действует очень похоже на метод, возвращающий построенный тип. И async
метод не может возвращать только какой-либо тип, он должен быть либо «огонь и забыть» void
, либо Task
.
Если конструктор типа T
фактически возвратил Task<T>
, это было бы очень запутанным, я думаю.
Если конструктор async вел себя так же, как метод async void
, этот тип разбивает, какой должен быть конструктор. После возврата конструктора вы должны получить полностью инициализированный объект. Не объект, который будет фактически правильно инициализирован в какой-то неопределенной точке в будущем. То есть, если вам повезло, и инициализация async не терпит неудачу.
Все это всего лишь предположение. Но мне кажется, что наличие возможности асинхронного конструктора приносит больше проблем, чем это стоит.
Если вы действительно хотите использовать семантику «огонь и забыть» методов async void
(чего следует избегать, если возможно), вы можете легко инкапсулировать весь код в метод async void
и вызвать это из своего конструктора, как вы упомянули в вопросе.
Предполагая, что имена ваших переменных могут содержать только буквы ASCII и цифры плюс символ подчеркивания, я бы выбрал
\b[a-z]\w*\b(?<!_)
EDIT: ...и, как указал @Stefan, вам нужно выбрать опцию "чувствительный к регистру".