2010-07-10 11 views
10

IV adında bir parametreyi kabul eden bir işlev var. Yine de, IV parametresinin boyutunu 16 olarak belirtebildiğim var mı?Bir işlev için geçirilen dizi parametresinin boyutunu açıkça belirtme

public AESCBC(byte[] key, byte[16] inputIV) 
{ 

    //blah blah 

} 

Yukarıdakiler elbette çalışmıyor. Mümkün mü? Biliyorum, fonksiyonun içinde kontrol edebilirim ve bir istisna atarım ama fonksiyon tanımında tanımlanabilir mi?

+3

Bunun için özel bir sınıf oluşturmanız gerekir. –

cevap

17

Temelde yapamazsınız. Jaroslav'un ​​dediği gibi, kendi türünüzü yaratabilirsiniz - ama bunun dışında, sadece bir istisna atmak zorunda kaldınız. Code Contracts ile

statik denetleyicisi ile yardımcı olabilecek bir formda bu ifade olabilir: Eğer sözleşmesini ihlal olabileceğini düşündüm eğer

Contract.Requires(inputIV.Length == 16); 

Sonra statik denetleyicisi yapı anda söyleyebilirdim. Bu sadece Visual Studio'nun Premium ve Ultimate sürümleriyle kullanılabilir.

(Hala VS Professional ile statik denetleyicisi olmadan Kod Sözleşmeler kullanabilirsiniz, ancak sözleşme almazsınız.)

Fiş: Şu Kod eğer C# in Depth 2nd edition gelen bölüm, indirmek için ücretsiz kullanılabilir İhale daha fazla bilgi istemek.

+0

Jon - Sadece kitabını aldım ve 30 $ için bu kadar fazla bilgi edinmediğimi söylemeliyim. 2. baskıyı da önceden sipariş ettim. İnanılmaz şeyler! – Marko

+1

Not: "CONTRACTS_FULL" derleme sembolünü tanımlamanız gerekir (önceden tanımlanmamışsa), aksi takdirde "Contract.Requires" derlenmeyecektir. –

+1

@Marko: Teşekkürler, bu güzel bir destek :) @Jaroslav: Evet, Kod Sözleşmelerini etkili bir şekilde kullanacaksanız, gerçekten bu tür şeyleri kolaylaştıran araçları indirmeniz gerekiyor. –

5

Keşfettiğiniz gibi, yöntem beyanında dizi parametresinin boyutunu belirtemezsiniz. Bir sonraki en iyi şey boyutunu denetlemek ve bir özel durum için şudur: byte[16] sarar bir sınıf oluşturmak ve bu geçmesine

public AESCBC(byte[] key, byte[] inputIV) 
{ 
    if(inputIV.Length() != 16) 
     throw new ArgumentException("inputIV should be byte[16]"); 

    //blah blah 

} 

Diğer bir seçenek.