Performans kuralları

Performans kuralları yüksek performanslı kitaplıkları ve uygulamaları destekler.

Bu bölümde

Kural Açıklama
CA1802: Uygun Yerlerde Değişmez Değerler Kullanın Alan statik ve salt okunur olarak bildirilir (Visual Basic'te Paylaşılan ve Salt Okunur) ve derleme zamanında hesaplamalı bir değerle başlatılır. Hedeflenen alana atanan değer derleme zamanında hesaplanabilir olduğundan, değerin çalışma zamanı yerine derleme zamanında hesaplanabilmesi için bildirimi bir const (Visual Basic'te Const) alanıyla değiştirin.
CA1805: Gereksiz yere başlatmayın .NET çalışma zamanı, oluşturucuyu çalıştırmadan önce başvuru türlerinin tüm alanlarını varsayılan değerlerine başlatır. Çoğu durumda, bir alanı varsayılan değeriyle açıkça başlatmak gereksizdir; bu, bakım maliyetlerini artırır ve performansı olumsuz etkileyebilir (örneğin, derleme boyutunun artması gibi).
CA1806: Yöntem sonuçlarını yok saymayın Yeni bir nesne oluşturulur ancak hiçbir zaman kullanılmaz ya da yeni dize oluşturup döndüren bir yöntem çağrılır ve yeni dize hiçbir zaman kullanılmaz ya da Bileşen Nesne Modeli (COM) veya P/Invoke yöntemi hresult veya hiç kullanılmayan bir hata kodu döndürür.
CA1810: Başvuru türündeki statik alanları satır içinde başlatın Bir tür açıkça tanımlanmış bir statik kurucu bildirdiğinde, tam zamanında (JIT) derleyici, statik kurucunun daha önce çağrılmış olduğundan emin olmak için türün her statik yöntemine ve örnek oluşturucusuna bir denetim ekler. Statik oluşturucu denetimleri performansı düşürebilir.
CA1812: Örneklendirilmemiş iç sınıflardan kaçının Derleme düzeyindeki bir türün örneği, derlemedeki kod tarafından oluşturulmaz.
CA1813: Korumasız özniteliklerden kaçının .NET, özel öznitelikleri almak için yöntemler sağlar. Varsayılan olarak, bu yöntemler öznitelik devralma hiyerarşisinde arama yapar. Öznitelik mühürleme kalıtım hiyerarşisi aracılığıyla aramayı ortadan kaldırır ve performansı artırabilir.
CA1814: Basit dizileri çok boyutlu dizilere tercih edin Düzensiz dizi, elemanları da dizi olan bir dizidir. Öğeleri oluşturan diziler farklı boyutlarda olabilir ve bu da bazı veri kümeleri için daha az boş alan kaybına neden olabilir.
CA1815: Değer türlerinde Equals yöntemini ve eşitlik işlecini geçersiz kılın Değer türleri için, Equals'ın devralınmış uygulaması Reflection kitaplığını kullanır ve türdeki tüm alanların içeriğini karşılaştırır. Yansıma hesaplama açısından maliyetlidir ve her alanın eşitliğini karşılaştırmak gereksiz olabilir. Kullanıcıların örnekleri karşılaştırmasını veya sıralamasını ya da örnekleri karma tablosu anahtarı olarak kullanmasını bekliyorsanız, değer türünüz Equals yöntemini uygulamalıdır.
CA1819: Özellikler diziler döndürmemelidir Özellik salt okunur olsa bile, bir özelliğin döndürdüğü diziler yazma korumalı değildir. Dizinin kurcalamaya karşı korumalı kalması için, özelliğin dizinin bir kopyasını döndürmesi gerekir. Tipik olarak kullanıcılar, böyle bir özelliği çağırmanın olumsuz performans etkilerini anlamaz.
CA1820: Dize uzunluğunu kullanarak boş dizeler için sınayın Dizeleri String.Length özelliğini veya String.IsNullOrEmpty yöntemini kullanarak karşılaştırmak, Equals kullanmaktan önemli ölçüde daha hızlıdır.
CA1821: Boş sonlandırıcıları kaldırın Mümkün olduğunda, nesnenin yaşam döngüsünü izlemenin getirdiği ek performans yükü nedeniyle sonlandırıcıları kullanmaktan kaçının. Boş bir sonlandırıcı, hiçbir fayda sağlamadan ek yük getirir.
CA1822: Üyeleri statik olarak işaretleyin Örnek verilerine erişmeyen veya örnek yöntemlerini çağırmayan üyeler statik olarak işaretlenebilir (Visual Basic'te paylaşılan). Yöntemleri statik olarak işaretledikten sonra derleyici, bu üyeler için sanal olmayan çağrı noktaları oluşturur. Bu, performansa duyarlı kodlar için ölçülebilir bir performans artışı sağlayabilir.
CA1823: Kullanılmayan özel alanlardan kaçının Derlemede erişimi görülmeyen özel alanlar algılandı.
CA1824: Derlemeleri NeutralResourcesLanguageAttribute ile işaretleyin NeutralResourcesLanguage özniteliği, Resource Manager'a bir derleme için nötr kültürün kaynaklarını görüntülemek için kullanılan dili bildirir. Bu ilk yüklediğiniz kaynak için arama performansını artırır ve çalışma kümenizi azaltabilir.
CA1825: Sıfır uzunluklu dizi ayırmalarından kaçının Sıfır uzunluklu bir dizinin başlatılması gereksiz bellek ayırmaya neden olur. Bunun yerine çağırarak Array.Emptystatik olarak ayrılmış boş dizi örneğini kullanın. Bellek ayırma, bu yöntemin tüm çağrılarında paylaşılır.
CA1826: Linq Enumerable yöntemi yerine özelliği kullanın Enumerable LINQ yöntemi, eşdeğer, daha verimli bir özelliği destekleyen bir tür üzerinde kullanıldı.
CA1827: Any kullanılabildiğinde Count/LongCount kullanmayın Count veya LongCount yöntemin daha verimli olacağı bir yöntem Any kullanılmıştır.
CA1828: AnyAsync kullanılabildiğinde CountAsync/LongCountAsync kullanmayın CountAsync veya LongCountAsync yöntemin daha verimli olacağı bir yöntem AnyAsync kullanılmıştır.
CA1829: Enumerable.Count yöntemi yerine Length/Count özelliğini kullanın Count LINQ yöntemi eşdeğer, daha verimli Length veya Count özelliği destekleyen bir tür üzerinde kullanılmıştır.
CA1830: StringBuilder'da Append ve Insert yönteminin kesin olarak belirlenmiş türlere sahip aşırı yüklerini tercih edin Append ve Insert System.String dışındaki birden çok tür için aşırı yüklemeler sağlar. Mümkün olduğunda, ToString() kullanımı ve dize tabanlı aşırı yükleme yerine güçlü türlendirilmiş aşırı yüklemeleri tercih edin.
CA1831: Uygun olduğunda dize için Aralık tabanlı dizin oluşturucular yerine AsSpan kullanın Bir dize üzerinde aralık dizinleyicisi kullanırken ve değer örtük olarak ReadOnlySpan<char> türüne atanırken, dizenin istenen bölümünün bir kopyasını üreten Slice yerine Substring yöntemi kullanılır.
CA1832: Bir dizinin ReadOnlySpan veya ReadOnlyMemory bölümünü almak için Aralık tabanlı dizin oluşturucular yerine AsSpan veya AsMemory kullanın Bir dizide aralık dizinleyicisi kullanıldığında ve değer örtük olarak bir ReadOnlySpan<T> veya ReadOnlyMemory<T> türüne atandığında, dizinin istenen bölümünün bir kopyasını oluşturan Slice yerine GetSubArray yöntemi kullanılır.
CA1833: Bir dizinin Span veya Memory bölümünü almak için Aralık tabanlı dizin oluşturucular yerine AsSpan veya AsMemory kullanın Bir dizide aralık dizinleyici kullanırken ve değeri örtük olarak bir Span<T> veya Memory<T> türüne atarken, dizinin istenen bölümünün bir kopyasını oluşturan Slice yerine GetSubArray yöntemi kullanılır.
CA1834: Tek karakterli dizeler için StringBuilder.Append(char) kullanın StringBuilder, bağımsız değişken olarak bir char alan bir Append aşırı yüklemesine sahiptir. Performansı geliştirmek için aşırı yüklemeyi çağırmayı char tercih edin.
CA1835: 'ReadAsync' ve 'WriteAsync' için 'Memory' tabanlı aşırı yüklemeleri tercih edin 'Stream', ilk bağımsız değişken olarak 'Memory<Byte>' alan bir 'ReadAsync' aşırı yüklemesine ve ilk bağımsız değişken olarak 'ReadOnlyMemory<Byte>' alan bir 'WriteAsync' aşırı yüklemesine sahiptir. Daha verimli olan bellek tabanlı aşırı yüklemeleri çağırmayı tercih edin.
CA1836: Kullanılabiliyorsa Count yerine IsEmpty tercih edin Nesnenin herhangi bir öğe içerip içermediğini belirlemek için, Count, Length, Count<TSource>(IEnumerable<TSource>) veya LongCount<TSource>(IEnumerable<TSource>) yerine daha verimli olan IsEmpty özelliğini tercih edin.
CA1837: Process.GetCurrentProcess().Id yerine Environment.ProcessId kullanın Environment.ProcessId , değerinden Process.GetCurrentProcess().Iddaha basit ve daha hızlıdır.
CA1838: P/Invokes parametrelerinden kaçının StringBuilder StringBuilder öğesinin marshalling işlemi her zaman yerel bir arabellek kopyası oluşturur; bu da tek bir marshalling işlemi için birden fazla ayırmaya neden olur.
CA1839: Process.GetCurrentProcess() yerine Environment.ProcessPath kullanın. MainModule.FileName Environment.ProcessPath , değerinden Process.GetCurrentProcess().MainModule.FileNamedaha basit ve daha hızlıdır.
CA1840: Thread.CurrentThread.ManagedThreadId yerine Environment.CurrentManagedThreadId kullanın Environment.CurrentManagedThreadId değerinden Thread.CurrentThread.ManagedThreadIddaha kompakt ve verimlidir.
CA1841: Sözlük İçeren yöntemleri tercih edin Keys veya Values koleksiyonunda Contains çağrısı yapmak, çoğu zaman sözlüğün kendisinde ContainsKey veya ContainsValue çağrısı yapmaktan daha maliyetli olabilir.
CA1842: 'WhenAll'ı tek bir görevle kullanmayın Tek bir görevle kullanmak WhenAll performans kaybına neden olabilir. Bunun yerine görevin tamamlanmasını bekleyin veya görevi döndürün.
CA1843: Tek bir görevle 'WaitAll' kullanmayın Tek bir görevle kullanmak WaitAll performans kaybına neden olabilir. Bunun yerine görevi bekleyin veya döndürün.
CA1844: 'Stream' alt sınıfına alırken zaman uyumsuz yöntemlerin bellek tabanlı geçersiz kılmalarını sağlayın Performansı geliştirmek için 'Stream' alt sınıfını oluştururken bellek tabanlı zaman uyumsuz yöntemleri geçersiz kılın. Ardından dizi tabanlı yöntemleri bellek tabanlı yöntemler açısından uygulayın.
CA1845: Span tabanlı 'string' kullanın. Concat' Substring ve birleştirme işleci yerine AsSpan ve string.Concat kullanmak daha verimlidir.
CA1846: Substring yerine AsSpan tercih edin AsSpan, Substring'den daha verimlidir. Substring bir O(n) dize kopyası gerçekleştirir, ancak AsSpan gerçekleştirmez ve sabit bir maliyeti vardır. AsSpan ayrıca herhangi bir öbek ayırma işlemi de yapmaz.
CA1847: Tek bir karakter araması için char değişmez değerini kullanın Tek bir karakter aramak yerine String.Contains(char) kullanınString.Contains(string).
CA1848: LoggerMessage temsilcilerini kullanma Daha iyi performans için LoggerMessage temsilcilerini kullanın.
CA1849: Eşzamansız bir yöntem içindeyken eşzamansız yöntemleri çağırın Zaten asenkron olan bir yöntemde, diğer yöntem çağrıları varsa bunların asenkron sürümlerine yapılmalıdır.
CA1850: ComputeHash yerine static HashData yöntemini tercih edin ComputeHash çağırmak için HashAlgorithm örneği oluşturup yönetmek yerine statik HashData yöntemini kullanmak daha verimlidir.
CA1851: Olası birden çok koleksiyon numaralandırması IEnumerable IEnumerable koleksiyonu üzerinde birden çok kez yineleme yapılması olası. Birden çok numaralandırmayı önleyen bir uygulama kullanmayı göz önünde bulundurun.
CA1852: İç türleri mühürleme Derlemesi dışında erişilmeyen ve içeren derleme içinde alt türü olmayan bir tür mühürlenmez.
CA1853: 'Dictionary.ContainsKey(key)' için gereksiz çağrı Dictionary.Remove(key) öğesini Dictionary.ContainsKey(key) ile korumaya gerek yoktur. Dictionary<TKey,TValue>.Remove(TKey) zaten anahtarın var olup olmadığını denetler ve yoksa atamaz.
CA1854: 'IDictionary.TryGetValue(TKey, out TValue)' yöntemini tercih edin 'ContainsKey' denetimiyle korunan bir Sözlük dizin oluşturucu erişimi yerine 'TryGetValue' seçeneğini tercih edin. Hem 'ContainsKey' hem de dizin oluşturucu anahtarı arar, bu nedenle 'TryGetValue' kullanıldığında ek arama engellenir.
CA1855: Span<T>.Fill() yerine Span<T>.Clear() kullanın Span içindeki öğeleri varsayılan bir değerle doldurmak için Span<T>.Fill(T) çağırmaktansa Span<T>.Clear() çağırmak daha verimlidir.
CA1856: ConstantExpected özniteliğinin yanlış kullanımı ConstantExpectedAttribute Özniteliği bir parametreye doğru uygulanmadı.
CA1857: parametresi en iyi performans için bir sabit bekler ConstantExpectedAttribute ile açıklama eklenmiş bir parametreye geçersiz bir argüman iletilir.
CA1858: IndexOf yerine StartsWith kullanın Bir dizenin belirli bir ön ekle başlayıp başlamadığını denetlemek için String.IndexOf çağırmaktansa String.StartsWith çağırmak daha verimlidir.
CA1859: Gelişmiş performans için mümkün olduğunda somut türler kullanın Kod, arabirim türlerini veya soyut türleri kullanarak gereksiz arabirim çağrılarına veya sanal çağrılara yol açar.
CA1860: 'Enumerable.Any()' uzantı yöntemini kullanmaktan kaçının Bir koleksiyon türünün herhangi bir öğe içerip içermediğini belirlemek için Enumerable.Any çağırmak yerine, Length, Count veya IsEmpty kullanmak (mümkünse) daha verimli ve daha açıktır.
CA1861: Sabit dizileri argüman olarak kullanmaktan kaçının Argüman olarak geçirilen sabit diziler yeniden kullanılmaz; bu da performans yüküne neden olur. Performansı artırmak için bunları 'static readonly' alanlarına taşımayı düşünebilirsiniz.
CA1862: Büyük/küçük harfe duyarlı olmayan dize karşılaştırmaları gerçekleştirmek için 'StringComparison' yöntemi aşırı yüklemelerini kullanın Kod, büyük/küçük harf duyarsız bir dize karşılaştırması gerçekleştirmek için ToLower() veya ToUpper() çağırdığında, gereksiz bir bellek ayırma yapılır.
CA1863: 'CompositeFormat' kullanın Biçimlendirme maliyetini azaltmak için, String.Format veya StringBuilder.AppendFormat için argüman olarak bir CompositeFormat örneğini önbelleğe alın ve kullanın.
CA1864: 'IDictionary.TryAdd(TKey, TValue)' yöntemini tercih edin Hem Dictionary<TKey,TValue>.ContainsKey(TKey) hem de Dictionary<TKey,TValue>.Add arama yapar; bu gereksizdir. Dictionary<TKey,TValue>.TryAdd çağırmak daha verimlidir; bu, değerin eklenip eklenmediğini gösteren bir bool döndürür. TryAdd anahtar zaten mevcutsa değerinin üzerine yazmaz.
CA1865-CA1867: char aşırı yüklemesini kullanın char aşırı yüklemesi, tek bir karakter içeren bir dize için daha iyi performans sunan bir aşırı yüklemedir.
CA1868: Kümelerde gereksiz 'Contains' çağrısı Hem ISet<T>.Add(T) hem de ICollection<T>.Remove(T) bir arama yapar; bu da ICollection<T>.Contains(T)’yi önceden çağırmayı gereksiz kılar. Öğenin eklenip eklenmediğini ya da kaldırılıp kaldırılmadığını belirten bir Boole değeri döndüren Add(T) veya Remove(T) öğesini doğrudan çağırmak daha verimlidir.
CA1869: 'JsonSerializerOptions' örneklerini önbelleğe alma ve yeniden kullanma System.Text.Json serileştirmeyle ilgili meta verileri sağlanan örnekte dahili olarak önbelleğe aldığı için, serileştirme veya seri durumdan çıkarma için yerel bir örneğinin JsonSerializerOptions kullanılması, kodunuz birden çok kez yürütülürse uygulamanızın performansını önemli ölçüde düşürebilir.
CA1870: Önbelleğe alınmış bir 'SearchValues' örneği kullanın Önbelleğe alınmış SearchValues<T> örnek kullanmak, değerleri doğrudan 'IndexOfAny' veya 'ContainsAny' öğesine geçirmekten daha verimlidir.
CA1871: 'ArgumentNullException.ThrowIfNull' öğesine null atanabilir bir yapı geçirmeyin 'ArgumentNullException.ThrowIfNull' bir 'object' kabul eder, bu nedenle null atanabilir bir yapı geçirmek değerin kutulanmasına neden olabilir.
CA1872: 'BitConverter.ToString' tabanlı çağrı zincirleri yerine 'Convert.ToHexString' ve 'Convert.ToHexStringLower' tercih edin Baytları onaltılık dize gösterimine kodlarken Convert.ToHexString veya Convert.ToHexStringLower kullanın. Bu yöntemler, tireleri ve String.ToLower öğesini değiştirmek için BitConverter.ToString ile String.Replace birleşimini kullanmaktan daha verimli ve bellek ayırma açısından daha elverişlidir.
CA1873: Pahalı olabilecek günlük kaydından kaçının Günlüğe kaydetme yöntemleri çağrıldığında, günlük düzeyi etkinleştirilmiş olsun veya olmasın, bu yöntemlerin argümanları değerlendirilir. Bu, günlük iletisi yazılmasa bile pahalı işlemlerin yürütülmesine neden olabilir. Daha iyi performans için, pahalı loglama çağrılarını bir kontrol ile IsEnabled koruyun veya LoggerMessage desenini kullanın.
CA1874: 'Regex.IsMatch' kullanın Regex.IsMatch , değerinden Regex.Match(...).Successdaha basit ve daha hızlıdır.
CA1875: 'Regex.Count' kullanın Regex.Count , değerinden Regex.Matches(...).Countdaha basit ve daha hızlıdır.
CA1877: 'Path.Combine' veya 'Path.Join' aşırı yükleme yöntemlerini kullanın Birden çok ardışık Path.Combine veya Path.Join işlem, birden çok yol kesimini kabul eden aşırı yüklemeler kullanılarak tek bir çağrıya daraltılabilir.
CA1878: Salt okunur dizi alanları yerine ReadOnlySpan özelliklerini tercih edin Özel statik salt okunur sabit dizi alanı bir ReadOnlySpan<T> özellik ile değiştirilebilir, böylece C# derleyicisi yönetilen dizi ayırmasını önleyebilir.