是否有一个“问题”;“正确或抛出”;或;非空或抛出“;C#中的表达式?
鉴于此工作代码:是否有一个“问题”;“正确或抛出”;或;非空或抛出“;C#中的表达式?,c#,expression,throw,C#,Expression,Throw,鉴于此工作代码: if(!this.TryParse())抛出新异常(); //或 如果(this.Parse()==null)抛出新异常(); 由于C#7已经知道使用?和?:抛出表达式,我想知道是否(或为什么不)有一种方法可以将其写成C#中的“true或throw”或“non-null或throw”语句,类似于JavaScript或PHP等其他语言所允许的。这就是我所尝试的: //编译错误: this.TryParse()抛出新异常(); 这个。Parse()??抛出新异常(); _=thi
if(!this.TryParse())抛出新异常();
//或
如果(this.Parse()==null)抛出新异常();
由于C#7已经知道使用?
和?:
抛出表达式,我想知道是否(或为什么不)有一种方法可以将其写成C#中的“true或throw”或“non-null或throw”语句,类似于JavaScript或PHP等其他语言所允许的。这就是我所尝试的:
//编译错误:
this.TryParse()抛出新异常();
这个。Parse()??抛出新异常();
_=this.TryParse()| |抛出新异常();
//作品:
_=this.TryParse()?0:抛出新异常();
_=this.Parse()??抛出新异常();
尤其是,为什么代码>可以工作,但不能工作
我为什么要这样做?纯可读性:我希望在行的开头将主要目的是执行而不是测试的方法作为调用语句保持清晰可见,并且不要在if条件下隐藏它们。以PHP为例:
mysql\u连接(…)
或者死();
\uu=
之所以有效,是因为在对象为null
的情况下,会引发异常而不是返回值。在这种情况下,??
右侧的表达式类型无关紧要
=||
不起作用,因为|
只能应用于两个布尔值。右侧的表达式不是布尔表达式。(我想说,它是未定义的。)\u=
之所以有效,是因为在对象为null
的情况下,会引发异常而不是返回值。在这种情况下,??
右侧的表达式类型无关紧要
=||
不起作用,因为|
只能应用于两个布尔值。右侧的表达式不是布尔表达式。(我想说,它是未定义的。)为什么要使用这种语法?代码应该尽可能可读,因为虽然它只写一次,但通常会被读几十次。如果我看到以下任一情况:
if (!this.TryParse()) throw new Exception();
// or
if (this.Parse() == null) throw new Exception();
我自然而然地认为程序员很困惑。为什么?因为有两件事:
TryParse
函数返回布尔值并填充输出参数。当您完全同意输入值是不可解析的,但不希望出现异常时,可以使用该选项。示例:
Parse
函数假定输入有效并返回有效的非空值,或引发异常。在这种情况下,抛出新异常是多余的,并且可能会混淆实际问题。例如:
请记住,这个例子可能不好,让我们看看几个备选方案。首先,您可以为此编写一个扩展方法:
public static AssertNotNull(this object item) {
if (item == null)
throw new ArgumentException(“Object was null.”);
}
因此,我们有两种可选语法:
您的语法(\uu=this.TryParse()?0:抛出新异常();
我的语法:
这两个词中哪一个更容易阅读?我最近在一位同事的同行评议中留下了一条评论,当时他使用了你的语法。在他的例子中,如果三元的第一部分是非空的,他在三元的右侧执行赋值。糟糕
底线:一个人应该总是尽可能明确地编写代码。为什么要使用这种语法?代码应该尽可能可读,因为虽然它只写一次,但通常会被读几十次。如果我看到以下任一情况:
if (!this.TryParse()) throw new Exception();
// or
if (this.Parse() == null) throw new Exception();
我自动地认为程序员很困惑。为什么?因为两件事:
TryParse
函数返回一个布尔值,并填充一个输出参数。当您完全同意输入值不可解析,但不希望出现异常时,可使用该函数。示例:
Parse
函数假定输入有效并返回有效的非空值,或引发异常。在这种情况下,引发新异常是多余的,可能会混淆实际问题。例如:
请记住,这个示例可能不太好,让我们看看几个备选方案。首先,您可以为此编写一个扩展方法:
public static AssertNotNull(this object item) {
if (item == null)
throw new ArgumentException(“Object was null.”);
}
因此,我们有两种可选语法:
您的语法(\uu=this.TryParse()?0:抛出新异常();
我的语法:
这两个词中哪一个更容易阅读?我最近在一位同事的同行评议中留下了一条评论,当时他使用了你的语法。在他的例子中,如果三元的第一部分是非空的,他在三元的右侧执行赋值。糟糕
底线:应该始终尽可能明确地编写代码。此场景可以使用扩展方法
static void Main(string[] args)
{
var a = false;
a.OrThrow();
}
}
public static class ThrowExtension {
public static void OrThrow(this bool b)
{
if(!b)
throw new Exception();
}
}
此场景可以使用扩展方法
static void Main(string[] args)
{
var a = false;
a.OrThrow();
}
}
public static class ThrowExtension {
public static void OrThrow(this bool b)
{
if(!b)
throw new Exception();
}
}
显而易见的答案是“因为他们没有那样指定”。可以找到关于抛出表达式的摘要。我想我们只能猜测原因,但实际上我认为这是有意义的。所有新的语言功能似乎都符合一个目的:能够以更具功能性的方法编写代码。让我们看看您的解析示例:
var parsed = Parse() ?? throw new Exception();
要在不使用throw表达式的情况下编写此函数,您必须计算Parse
两次,或者为了一个目的将parsed
变量写两次
if (Parse() == null) throw new Exception();
var parsed = Parse();
及
因此,前两个示例非常简单,如果(!this.TryParse())抛出新异常(),则编写this.TryParse()| | throw new Exception();
而不是if(!this.TryParse())抛出新异常()
在各个方面都是一样的。那么,为什么要为我们已有的相同概念引入新语法呢?记住Python的语言设计原则:
There should be one-- and preferably only one --obvious way to do it.
最后一个例子更为棘手。语句var a\u non\u false=