C# 条件?:语句是否可能?
是否有一条线与此等效:C# 条件?:语句是否可能?,c#,C#,是否有一条线与此等效: void AcceptChanges() => Data != null ? DoSomethingWithData(Data); 我想知道为什么到目前为止c#还没有提到这一点 由于void返回类型,也不可能执行类似的操作 void AcceptChanges() => Data != null ? DoSomethingWithData(Data) : null; 如果你不打算打电话的话,做这样的事情会更好 void AcceptChanges() =&
void AcceptChanges() => Data != null ? DoSomethingWithData(Data);
我想知道为什么到目前为止c#还没有提到这一点
由于void返回类型,也不可能执行类似的操作
void AcceptChanges() => Data != null ? DoSomethingWithData(Data) : null;
如果你不打算打电话的话,做这样的事情会更好
void AcceptChanges() => Data != null ? DoSomethingWithData(Data) : void;
还是新的含义??(因为在这种情况下bool表达式iitself不能为null)
编辑:最接近的解决方案是使用代理:
using System;
using System.Diagnostics.CodeAnalysis;
public static class VoidHelper
{
// ReSharper disable once UnusedParameter.Global
public static void RunVoid([NotNull] this object source, bool condition, Action action) =>
RunVoid(condition, action);
public static void RunVoid(bool condition, Action action)
{
if (condition)
action();
}
// ReSharper disable once UnusedParameter.Global
public static void RunVoid<T>([NotNull] this object source, bool condition, Action<T> action, T arg) =>
RunVoid(condition, action, arg);
public static void RunVoid<T>(bool condition, Action<T> action, T arg)
{
if (condition)
action(arg);
}
// Add more args if neccessary
public static void Test(object data) => RunVoid(data != null, () => DoSomethingWithData(data));
private static void DoSomethingWithData(object data) { }
}
使用系统;
使用System.Diagnostics.CodeAnalysis;
公共静态类帮助器
{
//ReSharper禁用一次未使用的参数。全局
public static void RunVoid([NotNull]此对象源、bool条件、操作)=>
RunVoid(条件、动作);
公共静态无效运行无效(布尔条件,动作)
{
如果(条件)
动作();
}
//ReSharper禁用一次未使用的参数。全局
public static void RunVoid([NotNull]此对象源、bool条件、动作动作、T参数)=>
RunVoid(条件、动作、参数);
公共静态无效运行无效(布尔条件、动作动作、T参数)
{
如果(条件)
动作(arg);
}
//如有必要,添加更多参数
公共静态无效测试(对象数据)=>RunVoid(数据!=null,()=>DoSomethingWithData(数据));
私有静态void DoSomethingWithData(对象数据){}
}
选项1:将方法转换为,并使用null传播运算符。仅当实例不为null时才会调用该方法
void AcceptChanges() => Data?.DoSomethingWithData();
选项2:不要使用表达式体语句,在if
中使用简单的空检查
void AcceptChanges()
{
if (Data != null)
{
DoSomethingWithData(Data);
}
}
为什么不干脆
if(Data!=null)DoSomethingWithData(Data)
?@JonathonChase不能用作表达式体函数。我想知道为什么到目前为止c中还没有解决这个问题。
← 这不是一个问题。如果你想要一个功能请求,那么这个请求也是错误的。至于为什么它不能作为一种语言规范来实现,这只是一种猜测,只能从观点中得出答案。Eric Lippert建议阅读:@sven krauter我相信这里的选项1就是你所寻找的选项1在逻辑上是错误的。包含AcceptChanges的对象应该处理数据,而不是扩展。@SvenKrauter扩展方法从SomeObject.SomeExtensionMethod()编译
toSomeStaticClass.SomeExtensionMethod(SomeObject)代码>,这是选项1所建议的。
void AcceptChanges()
{
if (Data != null)
{
DoSomethingWithData(Data);
}
}