2010-05-06 16 views
9

VS2010 ile standart olarak gelen kod sözleşmeleri kitaplığı hakkında bilgi almaya başladım. Çalıştığım bir şey, sözleşme maddelerinin bazılarının gerçekten ne anlama geldiği.Contract.Exists değeri nasıl ekler?

Örneğin, bu iki ifade nasıl farklı? Başka bir deyişle

Contract.Requires(!mycollection.Any(a => a.ID == newID)); 
Contract.Requires(!Contract.Exists(mycollection, a => a.ID == newID)); 

, Contract.Exists benim fonksiyonunu kullanarak veya statik kod analizi sistemi için ya bir geliştirici için, pratik amaçlar içinde ne yapar?

+0

@Chris Pebble, List.Exists - IEnumerable.Any arasındaki farkla ilgili olası yinelenen konuşmalar. Bu Contract.Exists ile ilgilidir - bu farklı bir bağlamdır. – Elisha

+0

İyi nokta. Kusura bakmayın. –

cevap

1

Tamam, cevabı buldum. Kod Sözleşmeleri Kullanım Kılavuzuna göre, bölüm 2.7.2:

"Ayrıca, Contract.Exists yerine System.Linq.Enumerable.Any uzantı yöntemini kullanmak da mümkündür."

Bunlar eşdeğerdir. Varoluş yerine Var'ı kullanacağım, bu yüzden kodumuzun geri kalanıyla tutarlı.

4

Deklanşör niteliği nedeniyle Contract.Exists'u kullanan sürüm tercih edilir. Bir başka avantaj, çerçevenin bu sözleşmeyi bilmesi ve statik analizde “yakalanma” şansının daha yüksek olmasıdır.

+0

"Deklarasyon niteliğinden dolayı tercih edilen" ile ne demek istediğini detaylandırabilir misiniz? Ayrıca, statik analiz aslında temsilcilerle çalışıyor mu? Bu lambdaya rasgele kod koyabildiğiniz gerçeğinin, herhangi bir olası statik analizi geçersiz kılacağını beklerdim. – scobi