C# 我应该测试Main的args数组中的值是否为空吗
根据这篇文章: 似乎args在中永远不能为nullC# 我应该测试Main的args数组中的值是否为空吗,c#,null,main,C#,Null,Main,根据这篇文章: 似乎args在中永远不能为null static void Main(string[] args) 好的,很高兴知道,但是,假设args.Length==1为真,是否可以让args[0]==null? 第一个观察:字符串数组可以有空元素 第二个观察:如果用命令行调用main,我不知道如何传递null,我认为这是不可能的 第三个观察:另一方面(这有点牵强),一些代码调用 Program.Main(new string[]{null}) 因此,有可能产生一种情况,即在args
static void Main(string[] args)
好的,很高兴知道,但是,假设args.Length==1为真,是否可以让args[0]==null?
第一个观察:字符串数组可以有空元素
第二个观察:如果用命令行调用main,我不知道如何传递null,我认为这是不可能的
第三个观察:另一方面(这有点牵强),一些代码调用
Program.Main(new string[]{null})
因此,有可能产生一种情况,即在args数组中获取空值
因此,问题是:
对主体论点的无效性进行测试是过分的还是良好的做法?(特别是考虑到第三次观察中称为“like”的主要因素不太可能发生)
例如:以下是正确的吗
static void Main(string[] args)
{
if(args.Length == 1)
{
var v = args[0].Replace("Foo", "Bar");//hope args[0] is not null
还是我应该这样做
static void Main(string[] args)
{
if(args.Length == 1 && args[0] != null)
{
//...
注意:我将其标记为C#但我想这也适用于其他语言正如您在问题中所写的那样,
static void Main()
是private
(因为private
如果缺失则是隐式的)。无论谁打电话给它,都必须使用反射,并且必须知道他正在微小的冰上行走。他有责任/义务传递正确的参数(在这种情况下,“正确”在任何地方都是“无null
值”)。如果他没有这样做,并且他收到了一个NullReferenceException
,那么故障只属于他自己。所以答案是“你没有义务检查null
值”(我不会这么做,这太过分了)
正如您所写的(以及参考答案中所写的),您不能从命令行传递null
,因此这消除了另一种可能性
有可能是一些代码调用
Program.Main(新字符串[]{null})
一个程序确实可以调用program.Main(null)
,因此args
确实可以调用null
问题是,你为什么要这么做?为什么要执行Main(null)
或Main(新字符串[]{null})
实际上,为什么要显式地调用Main
要么你在代码中做了一些愚蠢的事情,在这种情况下,发生了一些错误,然后意识到你做了一些愚蠢的事情是一件好事,要么有人在代码中做了一些愚蠢的事情,使用反射来访问你的代码,在这种情况下,最好让事情抛出异常和中断,并希望说服然后不要这样做!*
(可以通过一些特殊情况下的反射反映出
*“医生!医生!我这样做很痛!”“那就不要这样做!”操作系统永远不会在args数组中传递空元素。如果您正在编写拟从命令行执行的应用程序,则您有权依赖操作系统来履行本合同
如果有人(或您)编写调用方调用您的代码,则调用方有责任履行合同或捕获并处理违反合同可能导致的任何异常。找到报价的可能来源…:-)