如何显式指定传递给函数的数组参数的大小

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是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?

如果我们没有显式传递数组的大小,数组在哪里被初始化?

运行从 PowerShell 显式获取参数的 Python 函数(无需单独传递参数)

JavaScript 函数参数

如何显式传递隐式参数?

Python 装饰器强制显式传递参数