C# 基于布尔结果而不使用iF字的触发函数
或者只是C# 基于布尔结果而不使用iF字的触发函数,c#,lambda,delegates,ternary,C#,Lambda,Delegates,Ternary,或者只是 if(someBoolTest()) dothis() else dothat(); 这样做不是很好吗 if(someBoolTest()) dothis(); 或 这是用其他语言完成的吗? 我们如何在C#中做到这一点? (我认为我们做不到,那为什么不呢?) 编辑: 我知道三元操作,但这并没有使它看起来更好。如果能用某种形式的lambda和代理来实现这一点,那就太好了。您是这样做的 someBoolTest() => dothis() 但你到底想做什么 我们如何在C#中做到
if(someBoolTest()) dothis()
else dothat();
这样做不是很好吗
if(someBoolTest()) dothis();
或
这是用其他语言完成的吗?
我们如何在C#中做到这一点?
(我认为我们做不到,那为什么不呢?)
编辑:
我知道三元操作,但这并没有使它看起来更好。如果能用某种形式的lambda和代理来实现这一点,那就太好了。您是这样做的
someBoolTest() => dothis()
但你到底想做什么
我们如何在C#中做到这一点
使用if-else
子句,就像您在示例中所做的那样
你可以创造性地创造出这样的东西:
bool myBool = true;
bool newBool;
public void Main()
{
MyFunction( newBool = (aFunctionThatReturnsABool == true) ? true: false);
}
public void MyFunction (bool aBool)
{
// stuff based on the bool
}
但这是非常不可读的代码,不要这样做。我相信三元运算符就是您要寻找的: 变量=条件?值如果为真:值如果为假 例如,如果满足条件,则希望int等于0,如果不满足条件,则希望int等于3:
(SomeBoolTest() ? (Action)DoThis : DoThat)();
在这种情况下,n将被赋值为3!这上面有一个很好的维基百科页面,过来看看:)
您可以,但不应该,做一些类似于您提到的语法的事情,比如在
bool
类型上编写扩展方法,如下例所示:
int this = 500;
int that = 700;
int n = (this==that) ? 0 : 3;
需要调用方法,而不是设置变量
(aFunctionthatReturnsBool==true)?true:false
完全等同于返回工具的函数,顺便说一句。与if
语句相比,您的语法有什么优势?您需要知道,我真的不清楚这个问题的要点。这仅仅是一种咆哮,你对C#不是函数式语言感到不高兴吗?是的,这部分是一种咆哮。但同时,它也提出了一个问题:为什么C语言不能有这种语言扩展?但我对C语言很满意,它是我每天都在使用的。我确信函数式语言有不同的方法来进行if-else
分支。不过,我看不出他们有什么不对劲。@Black什么是脏话?@Black他指的是if else
我只是想说清楚。因为if-else
是编程的基本构建块之一。使用?:操作符的缺点是,is不起作用。你真的能清楚地表达你对if-else构造的反感吗?它将if推迟到一个较低的级别,这是一个improvement@Claies如您所见,答案明确指出“与语法相似的东西……”,它的目的并不是为了摆脱if语句。true,但在其他评论中,发帖人提出了这个问题的原因,首先是他们不喜欢if-else
,称之为“这些肮脏的单词,将从所有进化语言中删除”。这不是一个合理的说法,但海报已经明确表示,他们希望有一个替代if else
,而不仅仅是语法来隐藏它(除非我有点偏离)。当您希望条件表达式返回值,并且每个操作数都是返回值的函数时,这种方法非常有用。然而,问题是如何有条件地执行两个函数都不返回值的一对函数。
int this = 500;
int that = 700;
int n = (this==that) ? 0 : 3;
public static class UselessExtensions
{
public static void WhenTrue(this bool evaluatedPredicate, Action whenTrue)
{
if (evaluatedPredicate)
whenTrue();
}
}
public static class TryingUselessExtensions
{
public static bool SomeBoolTest()
{
return true;
}
public static void DoIt()
{
SomeBoolTest().WhenTrue(() => Console.WriteLine(true));
}
}