请向 vb-er 解释 C# 语法
Posted
技术标签:
【中文标题】请向 vb-er 解释 C# 语法【英文标题】:Please explain C# syntax to a vb-er 【发布时间】:2010-11-27 15:10:01 【问题描述】:我有以下代码sn-p:
// Notify the source (the other control).
if (operation != DropOperation.Reorder)
e = new DroppedEventArgs()
Operation = operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere,
Source = src,
Target = this,
DroppedItems = srcItems
;
src.OnDropped(e);
我不明白Operation = operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere
行。
谁能解释一下?作为记录... dropOperation 是一个枚举。 你能不能给 vb 语法等价的东西是我所需要的。
赛斯
【问题讨论】:
【参考方案1】:之所以难以理解,是因为你对三元运算符 ?: 不熟悉。基本上它所做的是评估一个表达式,并根据评估是返回 true 还是 false 返回两个值之一。
例如,如果布尔值为真,则以下表达式将返回“真”,否则返回“假”:
bool test = false;
string testString = test ? "true" : "false";
它实际上也存在于 VB.NET 中——尽管表达方式有所不同。这两条分别在C#和VB.NET中的语句其实是一样的
Dim s As String = If(True, "kek", "lol")
string s = true ? "kek" : "lol";
IIf 和三元运算符的区别在于 IIf 将始终计算第二个和第三个参数,因为 IIf 是一个函数而不是一个运算符。出于这个原因,三元运算符更受欢迎。
注意:三元运算符是在 VB 9 中添加的,因此如果您使用以前的版本,则必须依赖 IIF 函数来实现此功能。
【讨论】:
有趣,不知道(我已经有几年没有编写过 VB.NET 了)。鉴于使用短路评估,这绝对比IIf
函数更受欢迎。
+1 用于建议 If 而不是 Iif !!!此外,如果具有类型安全的优点,则不需要进行强制转换。
我认为您的代码中有错字。我没有看到Iif
,只有If
。
不是错字,if()是VB9的三元运算符。
谢谢夸...做到了。并感谢 vb 的三元运算课程。我对iif非常熟悉。很高兴知道现在有一个简短的版本。赛斯【参考方案2】:
If (operation = DropOperation.MoveToHere) Then
Operation = DropOperation.MoveFromHere
Else
Operation = DropOperation.CopyFromHere
End If
【讨论】:
很抱歉投了反对票,但 Qua 的回答确实应该高于这个。 @Joel Coehoorn:这是我听过的最奇怪的原因,但考虑到我只丢了 2 分,我不会对此大惊小怪 :-) 我总是回来检查这些。对您的帖子进行无操作编辑,我现在可以撤消反对票。【参考方案3】:Obligatory wikipedia link。我放弃了在评论中提到这个链接,所以这里是一个答案。您可以替换 ?调用 IIF 函数的运算符:
Operation = IIF(operation = DropOperation.MoveToHere, DropOperation.MoveFromHere, DropOperation.CopyFromHere)
请注意,它们并不是严格等价的,因为 IIF 函数 会同时评估真假情况,而 ? operator 只评估它返回的情况。
【讨论】:
If() 是严格等价的。没有理由使用 Iif,除非你被旧版本的 VB 卡住了。 Iif 也不是类型安全的。【参考方案4】:它有点相当于 VB.NET 中的 IIf
函数(参见 Brian 的评论):
Operation = IIf(operation = DropOperation.MoveToHere, _
DropOperation.MoveFromHere, _
DropOperation.CopyFromHere)
在 C# 中,这称为 conditional operator,是一种简单 if/else 语句的快捷方式。
【讨论】:
请注意,它们并不是严格等价的,因为 IIF 函数 会同时评估真假情况,而 ? operator 只评估它返回的情况。 @Brian:因此文本相当于,但您的评论仍然增加了很好的价值。 If() 是严格等价的。没有理由使用 Iif,除非你被旧版本的 VB 卡住了。 Iif 也不是类型安全的。【参考方案5】:这是条件运算符,很像VB的IIf
函数:
根据表达式的计算返回两个对象之一。
Public Function IIf( _
ByVal Expression As Boolean, _
ByVal TruePart As Object, _
ByVal FalsePart As Object _
) As Object
在这个特定的例子中,IIf
函数可以这样写:
Operation = IIF((operation = DropOperation.MoveToHere), _
DropOperation.MoveFromHere, _
DropOperation.CopyFromHere)
【讨论】:
不应使用 IIF 函数,因为它会计算两个表达式。三元运算符没有。 VB9 有一个新的三元 If 运算符,这是一个更好的匹配。 @Qua:在这种情况下很好。真假部分只是枚举。 确实如此,无需过多关注优化,值得一提的是,三元运算符是 ... 运算符,这意味着与 IFF 相比没有函数开销【参考方案6】:这是使用?
operator 进行条件赋值。这一行基本上是语法糖:
// C# expanded example
if (operation == DropOperation.MoveToHere)
Operation = DropOperation.MoveFromHere;
else
Operation = DropOperation.CopyFromHere;
这在 VB 中相当于:
If operation = DropOperation.MoveToHere Then
Operation = DropOperation.MoveFromHere
Else
Operation = DropOperation.CopyFromHere
End If
【讨论】:
【参考方案7】:operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere
这称为三元运算符。这基本上是一种简短的写作方式:
if (operation == DropOperation.MoveToHere)
return DropOperation.MoveToHere;
else
return DropOperation.CopyFromHere;
【讨论】:
【参考方案8】:?:
构造是三元运算符,基本上是内联if (x) y else x
。在这里可以看到内联的好处,因为它可以立即分配给一个变量。你不能用 if 语句来做到这一点。
【讨论】:
【参考方案9】:C# Blogger 使用“?”很多。看这段代码:
int Foo(int x, int y)
return x==y? 10: 11;
等于:
int Foo(int x, int y)
if (x==y)
return 10;
else
return 11;
只需阅读详细解释的甜甜圈的答案!
(“VB-er”我喜欢这个词)
【讨论】:
【参考方案10】:它被称为ternary operator.,我认为它在 VB 中不存在,但它基本上只是 if/else 的简写。
【讨论】:
以上是关于请向 vb-er 解释 C# 语法的主要内容,如果未能解决你的问题,请参考以下文章
请向我解释错误的性质:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序