Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA2012 |
| Başlık | ValueTask’leri doğru kullanın |
| Kategori | Güvenilirlik |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Öneri olarak |
| Geçerli diller | C# ve Visual Basic |
Neden
Üye ValueTask çağrısından döndürülen bir örnek, istisnalara, bozulmaya veya düşük performansa yol açabilecek bir şekilde kullanılıyor.
Kural açıklaması
ValueTask üye çağrılarından döndürülen örneklerin doğrudan beklenmesi hedeflenmiştir. Bir ValueTask'i birden çok kez kullanma veya tamamlanmadan önce sonucuna doğrudan erişme girişimi bir istisna veya bozulmaya neden olabilir. Böyle bir ValueTask'in yoksayılması büyük olasılıkla işlevsel bir hatanın göstergesidir ve performansı düşürebilir.
İhlalleri düzeltme
Genel olarak, ValueTasks doğrudan beklenmeli, atılmamalı veya yerel değişkenler ya da alanlar gibi diğer konumlarda depolanmamalıdır.
Uyarıların ne zaman bastırılması gerekiyor?
Rastgele üye çağrılarından döndürülen ValueTask nesneler için, çağıranın ValueTask nesnesinin bir kez ve yalnızca bir kez tüketilmesi gerektiğini (örneğin, beklenmesi) varsayması gerekir. Ancak geliştirici, çağrılan üyeyi de denetlerse ve uygulaması hakkında tam bilgiye sahipse, örneğin dönüş ValueTask her zaman bir Task nesneyi sarmalarsa, geliştirici uyarıyı gizlemenin güvenli olduğunu biliyor olabilir.
Example
public class NumberValueTask
{
public async ValueTask<int> GetNumberAsync()
{
await Task.Delay(100);
return 123;
}
public async Task UseValueTaskIncorrectlyAsync()
{
// This code violates the rule,
// because ValueTask is awaited multiple times
ValueTask<int> numberValueTask = GetNumberAsync();
int first = await numberValueTask;
int second = await numberValueTask; // <- illegal reuse
// ...
}
// This code satisfies the rule.
public async Task UseValueTaskCorrectlyAsync()
{
int first = await GetNumberAsync();
int second = await GetNumberAsync();
// ..
}
public async Task UseValueTaskAsTaskAsync()
{
ValueTask<int> numberValueTask = GetNumberAsync();
Task<int> numberTask = numberValueTask.AsTask();
int first = await numberTask;
int second = await numberTask;
// ...
}
}
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.