C#中是否有IIf个类似功能?还是类似的捷径?

推荐答案

和其他C风格的语言一样,C#有?个三元运算符.然而,这并不完全等同于IIf();有两个重要的区别.

为了解释第一个区别,这个IIf()调用的false part参数会导致DivideByZeroException,即使布尔参数是True.

IIf(true, 1, 1/0)

IIf()只是一个函数,和所有函数一样,在调用之前必须计算所有参数.换句话说,在传统意义上,IIf()并不意味着not短路.另一方面,这个三元表达式不会短路,因此非常好:

(true)?1:1/0;

另一个区别是IIf()不是类型安全的.它接受并返回Object类型的参数.三元运算符is类型安全.它使用类型推断来知道它处理的是什么类型.注意:使用您自己的通用IIF(Of T)()实现可以非常容易地解决这个问题,但开箱即用不是这样的.

如果你真的想要IIf()英寸C#,你可以:

object IIf(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart;}

或通用/类型安全实现:

T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}

另一方面,如果希望在VB中使用三元运算符,Visual Studio 2008及更高版本将提供一个新的If()operator,其工作原理与C#的三元运算符类似.它使用类型推断来知道它返回的是什么,它实际上是一个运算符而不是一个函数.这意味着预计算表达式没有问题,即使它有函数语义.

.net相关问答推荐

.NET 7,8 System.Text.Json反序列化多态参数

在计算Total毫秒时,.NET TimeSpan类中是否存在错误?

使用CLR将数据从Excel导入SQL Server时出错

为什么 PropertyInfo.SetValue 在此示例中不起作用以及如何使其起作用?

使用 Powershell TOM 在 SSAS 表格中创建分区

为什么这两个比较有不同的结果?

为什么不能使用 null 作为 Dictionary 的键?

为什么 .NET 内部 Hashtable 中有一个 Thread.Sleep(1)?

将客户端证书添加到 .NET Core HttpClient

防止对话框在按钮的单击事件处理程序中关闭

如何从 appsettings.json 中获取价值

为什么需要 XmlNamespaceManager?

Linq查询分组并 Select 第一个项目

Java 和 .NET 技术/框架的类似物

双倍的? = 双倍? + 双倍?

从 .NET 中的字符串末尾修剪字符串 - 为什么会丢失?

没有 @Html.Button !

如何从头开始以编程方式配置 log4net(无配置)

如何在 C# 中使用迭代器反向读取文本文件

作者主签名的时间戳发现了一个建链问题:UntrustedRoot: self-signed certificate in certificate chain