Assert () yöntemi ne yapıyor? Hala faydalı mı?


Yanıtlar:


200

Hata ayıklama derlemesinde, AssertBoole koşulunu parametre olarak alır ve koşul yanlışsa hata iletişim kutusunu gösterir. Koşul doğruysa program kesintisiz olarak devam eder.

Release'de derlerseniz, hepsi Debug.Assertotomatik olarak dışarıda bırakılır.


12
Sürüm modunda Debug.Assert ile aynı davranışı nasıl elde edebilirim?
Hamish Grubijan

15
Sürüm modu için Trace.Assert görünüşe göre refs: msdn.microsoft.com/en-us/library/… msdn.microsoft.com/en-us/library/e63efys0.aspx
Tim Abell

8
@HamishGrubijan Peki neden Debug.Assertserbest bırakma modunda olsun ki?
Camilo Martin

25
IMO, serbest bırakma kodundan açıklamaları atlamak, yuvaya yerleştirildiğinde cankurtaran matkapları yapmak ve daha sonra yelken açarken cankurtaran gemilerini geride bırakmak gibidir. :)
chrisd

113
Ekler bir cankurtaran teknesi değil, bir buzdağı algılama sistemidir. Kullanıcı gemiyi yönlendirmediği için sürüm kodundaki bir iddia sadece mahkum olduklarını söyler; buzdağından kaçmalarına izin vermez.
Stefan

97

Gönderen Kod tam

8 Savunma Programlama

8.2 Bildiriler

Bir iddia, geliştirme sırasında kullanılan bir koddur - genellikle bir program veya makro - bir program çalışırken kendisini kontrol etmesini sağlar. Bir iddia doğru olduğunda, bu her şeyin beklendiği gibi çalıştığı anlamına gelir. Yanlış olduğunda, kodda beklenmedik bir hata tespit ettiği anlamına gelir. Örneğin, sistem bir müşteri bilgi dosyasının hiçbir zaman 50.000'den fazla kayda sahip olmayacağını varsayarsa, program kayıt sayısının 50.000'den az veya ona eşit olduğunu iddia edebilir. Kayıt sayısı 50.000'den az veya ona eşit olduğu sürece, iddia sessiz olacaktır. Bununla birlikte, 50.000'den fazla kayıtla karşılaşırsa, programda bir hata olduğunu yüksek sesle "iddia edecektir".

İddialar özellikle büyük, karmaşık programlarda ve yüksek güvenilirlik programlarında kullanışlıdır. Programcıların, uyumsuz arabirim varsayımlarını, kod değiştirildiğinde hata veren hataları vb. Daha hızlı bir şekilde temizlemelerini sağlar.

Bir iddia genellikle iki argüman alır: doğru olması gereken varsayımı tanımlayan bir boole ifadesi ve eğer değilse görüntülenecek bir mesaj.

(...)

Normalde, kullanıcıların üretim kodunda onaylama mesajlarını görmesini istemezsiniz; iddialar öncelikle geliştirme ve bakım sırasında kullanım içindir. İddialar normalde geliştirme sırasında koda derlenir ve üretim kodundan derlenir. Geliştirme sırasında, iddialar çelişkili varsayımları, beklenmedik koşulları, rutinlere aktarılan kötü değerleri vb. Temizler. Üretim sırasında, iddialar sistem performansını düşürmemek için koddan derlenirler.


2
Katı Kod Yazma kitabında da iddiaların kullanımı hakkında büyük bir tartışma var. Bunlar harika bir hata ayıklama aracıdır!
zooropa

39

Değişkenleri kontrol etmek için her küçük kod satırını kırmak istemediğiniz zamanlar için kullanmalısınız, ancak belirli durumlar varsa bir tür geri bildirim almak istersiniz, örneğin:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

Yukarıdakine benzer bir kod satırı eklersem, programımı çalıştırmak şu hatayı verir: "hata CS0103: 'Debug' adı geçerli bağlamda yok". Çalışmasını sağlamak için bir çeşit kullanma ifadesine ihtiyacım var mı?
Josh Desmond

4
@JoshDesmondSystem.Diagnostics
Sinjai

16

Assert ayrıca Microsoft'un UI tasarım becerilerine kıkırdama fırsatı sunuyor. Demek istediğim: İptal Et, Yeniden Dene, Yoksay ve üç düğmeli bir iletişim kutusu ve başlık çubuğunda bunların nasıl yorumlanacağıyla ilgili açıklama!


3
İptal / Yeniden Dene / Yoksay klasik! Windows 3.1'in bunu her zaman görüntülemesine neden olan iddialar mıydı?
devlord

Temel olarak, söylediğiniz gibi Windows 3.1'e dayanan ve yalnızca önceden tanımlanmış düğme etiketlerine sahip olan bir MessageBox kullanmasıdır. Yani hack'in neden ortaya çıktığını anlayabiliyorsunuz, ancak 2008'de neden hala orada değil!
Joe

4
@Joe Bu sadece son kullanıcılar değil, geliştiriciler tarafından görülmesi gereken bir şeydir, bu yüzden güncelleme muhtemelen çok düşük öncelikli bir öğedir. Rahatsız olursa, varsayılan işleyiciyi istediğiniz her şeyi yapan biriyle değiştirmek için Debug.Listeners veya Trace.Listeners koleksiyonlarını değiştirebilirsiniz.
Dan Is Fiddling Tarafından Firelight

5
Ve şimdi 2019 ve aynı iletişim kutusu / düğmeleri hala burada!
19'da Bouke

10

Assert, kodunuzda bir koşulun (posta veya ön) geçerli olduğunu iddia etmenizi sağlar. Bu, niyetlerinizi belgelemenin ve hata ayıklayıcının niyetiniz karşılanmadığı takdirde sizi bir iletişim kutusu ile bilgilendirmesini sağlamanın bir yoludur.

Bir kesme noktasının aksine, Assert kodunuzla birlikte gelir ve niyetiniz hakkında ek ayrıntılar eklemek için kullanılabilir.


10

Assert, test etme ve bırakma arasında ayrı mesajlaşma davranışı vermenize yardımcı olabilir. Örneğin,

Debug.Assert(x > 2)

yalnızca bir "debug" derlemesi çalıştırıyorsanız, bir break derlemesi çalıştırmazsanız bir mola tetikler. Burada bu davranışın tam bir örneği var


10

Öncelikle Assert()yöntem Traceve Debugsınıflar için kullanılabilir .
Debug.Assert()yalnızca Hata Ayıklama modunda yürütülüyor.
Trace.Assert()Hata Ayıkla ve Bırak modunda yürütülüyor.

İşte bir örnek:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

Bu kodu Hata Ayıklama modunda ve ardından Serbest bırakma modunda çalıştırın.

resim açıklamasını buraya girin

Hata Ayıklama modu sırasında kod Debug.Assertdeyiminizin başarısız olduğunu, uygulamanın geçerli yığın izini gösteren bir ileti kutusu aldığınızı fark edeceksiniz . Trace.Assert()Koşul doğru olduğu için Yayınlama modunda bu gerçekleşmiyor (i == 4).

WriteLine() yöntemi, bilgileri Visual Studio çıktısına kaydetme seçeneği sunar. resim açıklamasını buraya girin


5

İddialar, Design by Contract (DbC) 'de, anladığım kadarıyla Meyer, Bertand tarafından tanıtıldı / onaylandı. 1997. Nesneye Yönelik Yazılım Yapısı.

Önemli bir özellik, yan etkiler üretmemeleri gerektiğidir, örneğin bir istisna işleyebilir veya bir if ifadesiyle farklı bir işlem yapabilirsiniz (savunma amaçlı programlama).

Sözleşmenin ön / posta koşullarını, müşteri / tedarikçi ilişkisini kontrol etmek için iddialar kullanılır - müşteri, tedarikçinin ön koşullarının karşılandığından emin olmalıdır. £ 5 gönderir ve tedarikçi post-koşulların karşılandığından emin olmalıdır. 12 gül verir. (Müşteri / tedarikçinin basit açıklaması - daha az kabul edebilir ve daha fazlasını sunabilir, ancak İddialar hakkında). C #, sürüm kodu için kullanılabilen Trace.Assert () yöntemini de sunar.

Soruyu cevaplamak için evet hala yararlılar, ancak kod ve zamana karmaşıklık + okunabilirlik + bakımı zor olabilir. Onları hala kullanmalı mıyız? Evet, hepsini kullanacak mıyız? Muhtemelen hayır ya da değil, Meyer'ın tarif ettiği ölçüde.

(Bu tekniği öğrendiğim OU Java kursu bile sadece basit örnekler gösterdi ve geri kalan kodlar kodun çoğunda DbC onaylama kurallarını zorunlu kılmadı, ancak programın doğruluğunu sağlamak için kullanıldığı varsayıldı!)


3

Düşünme şeklim Debug.Assert, bir yöntemin nasıl çağrılması gerektiği hakkında bir sözleşme oluşturmanın bir yoludur, bir parametrenin (yalnızca tür yerine) değerleri hakkındaki ayrıntılara odaklanır. Örneğin, ikinci parametrede null değer göndermemeniz gerekiyorsa, tüketiciye bunu yapmamasını bildirmek için Assert'i bu parametrenin etrafına eklersiniz.

Birinin kodunuzu bonehead bir şekilde kullanmasını engeller. Ama aynı zamanda, bu başlı yolun üretime geçmesine ve bir müşteriye kötü mesaj vermemesine izin verir (bir Release derlemesi inşa ettiğiniz varsayılarak).


6
Bununla birlikte, genel yöntemlerde geçersiz parametrelerin argüman istisnaları atması gerektiğine dikkat etmek önemlidir. Yalnızca özel yöntemler girdiyi onaylarla doğrulamalıdır. Dışarıdan gelen değerler daima şüphelidir!
Jeffrey L Whitledge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.