У меня есть функция, которая принимает параметр под названием IV. Есть ли так или иначе, что я могу явно указать размер параметра IV, чтобы быть 16?
public AESCBC(byte[] key, byte[16] inputIV)
{
//blah blah
}
Вышеупомянутое, конечно, не работает. Действительно ли это возможно? Я знаю, что могу проверить его в функции и выдать исключение, но это может быть определено в функциональном определении?
В принципе, вы не можете. Как говорит Ярослав, вы можете создать свой собственный тип - но кроме этого, вы просто бросаете исключение.
С помощью Code Contracts вы можете выразить это в форме, с которой может помочь статическая проверка:
Contract.Requires(inputIV.Length == 16);
Тогда статическая проверка может сказать вам во время сборки, если она считает, что вы нарушаете контракт. Однако это доступно только в Premium и Ultimate редакциях Visual Studio.
(Вы все еще можете использовать Code Contracts без статической проверки в VS Professional, но вы не получите контракты.)
Plug: В настоящее время глава Code Contracts из C# in Depth 2nd edition доступна для свободного скачивания, если вы хотите получить больше информации.
Вы не можете указать размер параметра массива в объявлении метода, как вы обнаружили. Следующий лучший вариант - проверить размер и выбросить исключение:
public AESCBC(byte[] key, byte[] inputIV)
{
if(inputIV.Length != 16)
throw new ArgumentException("inputIV should be byte[16]");
//blah blah
}
Другой вариант - создать класс, который обернет byte[16]
и передать его через метод.