Konwencja nazewnicza: nazwa + Async

0

Czemu ma służyć konwencja "Async" dla metod, które zwracają Task.? Przecież widzę, że jest to operacja asynchroniczna, słowo await mnie o tym informuje.


var test = await service.GetItemAsync();

2

Tylko nie zawsze się zwraca Task i nie zawsze używa await w metodach, które są asynchroniczne.

IMO mogli pomyśleć nad jakimś oznaczeniem w IDE dla metod, które mają słowo kluczowe async i chyba by wystarczyło.

1

Często jest tak, że w klasie chcesz mieć zarówno metodę synchroniczną jak i asynchroniczną. Bez postfixu async nie mógłbyś ich mieć jednocześnie z tą samą nazwą.

0

No tak, ale pomimo tego nie mogę znaleźć sensu w używaniu tego suffixu dla metod, które zwracają Task<AnyObject> (nie dla void).

Jeśli nie używamy await to i tak moim zdaniem forma:


var test = service.GetItem().Resullt;

Jest wystarczająco czytelna.

Możesz mieć dwie metody o tej samej nazwie (które coś zwracają):

async Task<object> Test();
object Test();
1

Ta konwencja pochodzi przede wszystkim z czasów kiedy w języku jeszcze nie było wsparcia dla asynchroniczności (async await), i tak już zostało, nie chcesz nie używaj, ja nie używam ;)

2
Gworys napisał(a):

Możesz mieć dwie metody o tej samej nazwie (które coś zwracają):

async Task<object> Test();
object Test();

Być może coś mi umknęło, bo nigdy nie widziałem czegoś takiego. Na czym to kompilujesz? W projekcie w VS2017 z wybranym .net'em 4.6.1 nie jestem w stanie skompilować takiego kodu:

public class TestClass
{
	public object Test()
	{
		return null;
	}

	public async Task<object> Test()
	{
		return await Task.FromResult<object>(null);
	}
}

Pięknie dostaję błąd pod tytułem Type 'TestClass' already defines a member called 'Test' with the same parameter types tak jak oczekiwałem.
Przeciążanie metod polega na przeciążaniu parametrów, a nie typów zwracanych.

3

Ja kiedyś zrobiłem śmieszny błąd. Metoda nie miała async w nazwie i zwracała generycznego taska od klasy która miała właściwość Id. Nie zrobiłem na tej metodzie await, a potrzebowałem tylko wartość Id zwracanego obiektu.Trochę czasu minęło aż doszedłem co nie działa. Problem był w tym że Task sam w sobie też posiada właściwość Id i pobierałem ją ponieważ nie robiłem await na tym tasku. Jakie było moje zdziwienie jak w bazie zapisywałem Id Taska zamiast obiektu xD.

1 użytkowników online, w tym zalogowanych: 0, gości: 1