如何显式指定传递给函数的数组参数的大小
Posted
技术标签:
【中文标题】如何显式指定传递给函数的数组参数的大小【英文标题】:How to explicitly specify the size of an array parameter passed to a function 【发布时间】:2011-03-14 04:23:10 【问题描述】:我有一个函数,它接受一个名为 IV 的参数。无论如何,我可以明确指定参数 IV 的大小为 16 吗?
public AESCBC(byte[] key, byte[16] inputIV)
//blah blah
以上当然是行不通的。可能吗?我知道我可以在函数内部检查它并抛出异常,但它可以在函数定义中定义吗?
【问题讨论】:
您必须为此创建一个自定义类。 【参考方案1】:你不能,基本上。正如 Jaroslav 所说,您可以创建自己的类型 - 但除此之外,您只能抛出异常。
使用Code Contracts,您可以用静态检查器可以帮助的形式表达这一点:
Contract.Requires(inputIV.Length == 16);
然后静态检查器可以在构建时告诉您它是否认为您可能违反了合同。不过,这仅适用于 Visual Studio 的高级版和终极版。
(您仍然可以在没有 VS Professional 的静态检查器的情况下使用代码合同,但您不会获得合同。)
插件:如果您想了解更多信息,目前可以免费下载来自C# in Depth 2nd edition 的代码合同章节。
【讨论】:
乔恩 - 我刚买了你的书,我不得不说我从来没有花 30 美元获得这么多的知识。我也预购了第二版。很棒的东西! 注意:您需要定义CONTRACTS_FULL
编译符号(如果尚未定义),否则Contract.Requires
将不会被编译。
@Marko:谢谢,这是一个可爱的认可 :) @Jaroslav:是的,如果你要有效地使用代码契约,你真的需要下载使这类事情变得简单的工具。
在过去 6 年中这种情况有没有可能发生变化?
@Cullub:答案中的两个链接仍然有效; C# in Depth 第三和第四版没有代码合同。【参考方案2】:
正如您所发现的,您不能在方法声明中指定数组参数的大小。下一个最好的方法是检查大小并抛出异常:
public AESCBC(byte[] key, byte[] inputIV)
if(inputIV.Length != 16)
throw new ArgumentException("inputIV should be byte[16]");
//blah blah
另一种选择是创建一个包装 byte[16]
的类并通过它。
【讨论】:
以上是关于如何显式指定传递给函数的数组参数的大小的主要内容,如果未能解决你的问题,请参考以下文章
PHP是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?