2010-07-10 15 views
10

J'ai une fonction qui accepte un paramètre nommé IV. Y at-il de toute façon que je puisse spécifier explicitement la taille du paramètre IV à 16?Comment spécifier explicitement la taille d'un paramètre de tableau transmis à une fonction

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

    //blah blah 

} 

Ce qui précède ne fonctionne bien sûr pas. C'est possible? Je sais que je peux le vérifier dans la fonction et lancer une exception mais peut-il être défini dans la définition de la fonction?

+3

Vous devez créer une classe personnalisée pour cela. –

Répondre

17

Vous ne pouvez pas, fondamentalement. Comme dit Jaroslav, vous pouvez créer votre propre type - mais à part ça, vous êtes bloqué avec juste une exception.

Avec Code Contracts vous pourriez exprimer sous une forme qui le vérificateur statique pourrait aider à:

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

Ensuite, le vérificateur statique pourrait vous dire au moment de la construction si elle a pensé que vous pourriez être violez le contrat. Ceci est uniquement disponible avec les éditions Premium et Ultimate de Visual Studio.

(Vous pouvez toujours utiliser le code des contrats sans le vérificateur statique avec VS professionnel, mais vous ne serez pas les contrats.)

Fiche: Actuellement, le code des marchés chapitre de C# in Depth 2nd edition est disponible gratuitement à télécharger, si vous veux plus d'informations.

+0

Jon - Je viens d'acheter votre livre et je dois dire que je n'ai jamais eu autant de connaissances pour 30 $. J'ai également préordonné la 2ème édition. Des trucs incroyables! – Marko

+1

Note: vous devez définir le symbole de compilation 'CONTRACTS_FULL' (s'il n'est pas déjà défini), sinon' Contract.Requires' ne sera pas compilé. –

+1

@Marko: Merci, c'est une belle approbation :) @Jaroslav: Oui, si vous allez utiliser efficacement les contrats de code, vous devez vraiment télécharger les outils qui facilitent ce genre de choses. –

5

Vous ne pouvez pas spécifier la taille du paramètre de tableau dans la déclaration de méthode, comme vous l'avez découvert. La meilleure chose est de vérifier la taille et jeter une exception:

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

    //blah blah 

} 

Une autre option pour créer une classe qui enveloppe byte[16] et passer que par.