当前位置: 首页 > 编程语言 > C#

为什么params会有这样的行为?分享

时间:2023-04-10 18:54:11 C#

为什么params会有这样的行为?Output12Null2CodeclassProgram{staticvoidMain(String[]args){Strings=null;打印长度;打印长度(秒,秒);打印长度(空);打印长度(空,空);控制台.ReadKey();}privatestaticvoidPrintLength(paramsString[]items){Console.WriteLine(items==null?"null":items.Length.ToString());}}这是一个常见问题。详见规范7.4.1、7.4.3.1。简而言之:具有参数数组的方法适用于其“正常形式”或其“扩展形式”。也就是说,您可以说PrintLength(newstring[]{"hello"});//正常形式PrintLength("hello");//扩展形式,由编译器翻译成正常形式。当为这两种形式给出时,编译器总是选择普通形式而不是扩展形式。假设我们选择在每次应用时扩展表单。假设你有voidM(paramsobject[]x){}如果我们总是选择扩展表单,你实际上如何将一个空数组传递给这个东西?那是不可能的!假设你说M(newobject[]{"hello"});我们总是选择扩展形式。会是什么?好吧,一个对象数组就是一个对象,所以这个会选择扩展形式——它会创建另一个数组,把这个东西包在数组里,然后传下去!将表单扩展到普通表单的选项会导致疯狂的结果。始终选择普通形式而不是扩展形式更明智。我正在按设计工作,我会说:PrintLength(oneormore);您传入一个null字符串-在您的方法中,项目不会为null-它是一个元素的数组-字符串类型-值为nullPrintLength(s,s);同样的故事-你传递了两个元素,所以你的方法中的项目将是一个包含两个字符串的数组-两个字符串本身都是空的,但数组不是PrintLength(NULL);这显然被解释为单个NULL值,因此items为空。您没有传入数组,也没有传入字符串类型的元素——您只是传入了一个空值本身。打印长度(空,空);这又是一个包含两个元素的数组,这两个元素都是空值——但数组本身不是空值,因为您传递了两个值。这可能有点令人费解-但实际上:您需要在PrintLength方法中检查的不是您的Items是否为null-而是实际值items[0]等是否为null。将单个显式“null”值视为“null”而不是单个空值项的数组可能有点奇怪-或者首先违反直觉。这是为什么,以及它是否可能以不同的方式实施-老实说,我不知道。PrintLength(null)传递一个空数组,其中PrintLength(null,null)传递一个长度为2的string[],其中包含两个空字符串对象。这与传递newstring[]{null,null}一样好吧,阅读我写的内容可能并不能真正回答你的问题,只是耸耸肩。编辑:这可能是原因:您可以在参数声明中发送以逗号分隔的指定类型的参数列表,或指定类型的参数数组。http://msdn.microsoft.com/en-us/library/w5zay9db.aspx如回答一所述:以上是C#学习教程:为什么params会这样?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: