Re: Почему свойства C# не могут быть асинхронными?
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.04.23 09:56
Оценка: 25 (4) +3
Здравствуйте, vaa, Вы писали:

vaa>Или могут? Или нельзя, но иногда можно?

Давайте разберёмся. Свойство — это пара методов со специальным синтаксисом вызова, похожим на обращение к полю.
Можно обратно деконструировать их до методов:
public abstract class Sample<T> 
{
   public abstract void SetA(T value);
   public abstract T GetA();
}

Теперь можно сделать эти методы асинхронными:

public abstract class Sample<T> 
{
   public abstract Task SetA(T value) {};
   public abstract Task<T> GetA() {};
}

Из сигнатур методов видим, что превратить эти методы обратно в свойство не получится, т.к. у них неподходящие сигнатуры.
Сделать read-only асинхронное свойство можно:
public abstract class Sample<T> 
{
   public abstract Task SetA(T value) {};
   public abstract Task<T> A {get};
}

   Sample<int> sample = ...;
   var v = await sample.A; // type of v = int;

Но вот асинхронную установку значения в таком стиле сделать не выйдет.
   Sample<int> sample = ...;
   await sample.A = 42; // oops!
   await sample.SetA(42); // ok


Tсли бы это было возможно, как бы должен был работать код типа такого:
   Sample<int> sample = ...;
   await sample.A += 5; // oops!

Будет ли там 2 await двух методов, выполненные один за другим?


Общее мнение команды C# — async свойства не нужны. См. тж. https://github.com/dotnet/roslyn/issues/3015
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.