Soru Çalışma zamanında Kod Sözleşmeleri


Özet bir kitapta okuduğum kadarıyla, kod sözleşmeleri çalışma zamanı performansını düşürebilir.

Kod sözleşmelerini üretimde devre dışı bırakmak mümkün mü?


18
2017-07-14 18:28


Menşei




Cevaplar:


Kullanım kılavuzu Bunu ayrıntılı bir şekilde açıklıyor - yapabileceğiniz her türlü seçenek var. Her derleme yapılandırması, sözleşmelerin yürütme süresinde kontrol edildiği farklı ayarlara sahip olabilir ve "tamam ya da hiçbir şey" seçeneği değildir - Visual Studio'da ayarlanabilen ayarlara bağlı olarak, sözleşmelerin bir kısmını ya da hiçbirini zorlayabilirsiniz.


31
2017-07-14 18:31





En sevdiğim seçenekler açıklandı blogumda.

Özetlemek:

  • Yayınlama modunda, Çalışma Zamanı Denetimi Denetimi Gerçekleştir seçeneğinin işaretini kaldırmayı, ancak Sözleşme Referans Derlemesini Oluşturmayı seçmenizi öneririm. Bu, önkoşulları müşterilerinizin isteğe bağlı olarak kullanabileceği ayrı bir dll'ye yerleştirecektir (eğer Call-Site Check Check'i kontrol ediyorlarsa), ancak bu seçeneği kontrol etmezlerse tüm ek yükü kaldırır.
  • Hata Ayıklama modunda, Çalışma Zamanı Sözleşmesinin Tamamlandığını Denetle'yi ayarlayın.

Bazı kullanıcılar Yayınlama sürümlerine dahil edilmek için Önkoşulları tercih ediyor. Bu özellikle NuGet üzerinden dağıtılıyorsa yararlıdır çünkü Code Contract dlls'i desteklemiyorlar. NuGet paketlerimde, Sürüm yapılarında Önkoşullar dahil olmak üzere geçiş yapmaktayım, ancak "Önşartsız Sürüm Oluşturma" yapısı için ayrı bir indirmeye de sahibim.


12
2017-07-14 19:02





Performans farkı oldukça küçüktür ve kodunuzu dikkat çekici bir şekilde etkilemez. Gerçek zamanlı bir hisse senedi alım satım sistemi geliştirmediğiniz sürece, ciddi olarak endişelenmeyeceğim.

Üretimdeki kodu devre dışı bırakmak için, muhtemelen anlaşılmamış bir hata yerine Kod Sözleşmelerinin ek korumasını daha çok tercih ediyorum. Kod sözleşmesindeki bir hata, bazı kötü verilerin çağrı yığını ağacından 5 seviyeye geçtiği için, bazı derin çağrı yığınlarını kazmak zorunda kalmanın aksine Sözleşmenin tam olarak nerede ve neden ihlal edildiğini size söyleyecektir.

@svanryckeghem ve @Stephen Cleary: Kullanıyorsanız veya kullanmayı planlıyorsanız Contract.Requires<TException> ve 'Çalışma Zamanı Denetimi Denetimi'ni etkinleştirmeyin, Kod Sözleşmelerinin kullanımına bağlı olması gereken IL rewriter (ccrewrite.exe) hakkında bir çalışma zamanı hatası alırsınız. Daha sonra bunun çalışması için Çalışma Zamanı Denetimi Denetimi'ni etkinleştirmeniz gerekecektir.

IMHO kullanımı Contract.Requires<TException>() çok daha faydalı Contract.Requires() atılan istisna türü üzerinde kontrol sahibi olduğunuzdan.


6
2017-11-29 21:19



Contract.Requires<TException>(), Bunun daha yararlı olduğunu kabul etmiyorum, bence bu daha çok eski bir şeydir - hiç kullanmadım. Sözleşme gerektirenler, hemen hemen tüm argüman istisnalarıdır ve boole durumu yeterli bilgidir; eğer işleri uygun şekilde tasarlarsan. Contracts sadece başka bir yol değil Exceptions, farklı bir yaklaşım gerektirirler. - nicodemus13
Yorumunuzdaki işlevsel ifade "... neredeyse tüm istisnalar ..." dır. "Hemen hemen" temelli sözleşmeler kurmak istemiyorum. Hepsinin aynı türde bir Özel Durum olduğunu garanti edebilecek olursam, o zaman Contract.Requires <TException> () kullanılarak gereksizdir. Ancak, bu garanti edilmez ve tüm senaryoları - özellikle de davaları - kapsamayı tercih ederim, aksi takdirde sözleşmeleriniz spekülasyonlardan başka bir şey değildir. - Dave Black


Proje özelliklerinde Kod Sözleşmesine gidin, "Sürüm" Yapılandırmasını seçin ve çalışma zamanı kontrolünün işaretini kaldırın.


3
2017-07-14 18:32