【问题标题】:is it possible to use ?? operator on class member?可以用吗??类成员的运算符?
【发布时间】:2010-12-05 02:28:47
【问题描述】:

在 c# 中有一个很棒的运算符 '??'这使生活变得更加简单。我可以写foo ?? default,而不是写(foo != null)? foo : default。有没有一种简单的方法可以将此运算符应用于类成员,例如在(foo != null)? foo.bar : default的情况下?

更新:好的,我会解释一下:

string a = (someVeryLongVariableName != null)? someVeryLongVariableName : ""; // Long way
string a = someVeryLongVariableName ?? ""; // Shorter with same result
string a = (someVeryLongVariableName != null)? someVeryLongVariableName.bar : ""; // What's the shorter way in this case?

upd2:我需要这个功能的情况如下:

if (foo is MyClass) bar1 = (foo as MyClass).SpecificMember;
if (foo is OneMoreClass) bar2 = (foo as OneMoreClass).AnotherSpecificMember;
if (foo is MyFavoriteClass) bar3 = (foo as MyFavoriteClass).YetAnotherMember;

如果我能把它们缩短成类似的东西会很酷

bar1 = (foo as MyClass).SpecificMember ?? null;

也许它不会更短,但它只将 foo 转换为 MyClass 一次,并使用默认值显式初始化 bar。最重要的是它看起来更好。

【问题讨论】:

  • 什么不是简单的写作 (foo != null) ? foo.bar : 默认 ??
  • 什么?我不确定你能不能变得更简单......我错过了什么吗?
  • 在 upd2 中,您分配了 3 个不同的变量(bar1、bar2 和 bar3)。我看不出仅将其缩短为 bar1 分配对您有何帮助。还是您打算只分配 bar1 并错误地给出了错误的示例?

标签: c# .net


【解决方案1】:

没有内置的 C# 运算符可以执行您所描述的操作。一个新的运算符(大多数人建议.??.)一直是requested,但它对C# 有not been added

作为一种解决方法,许多开发人员实现了IfNotNull 扩展方法,例如,在此StackOverflow questionanswer 中。

【讨论】:

    【解决方案2】:

    只有当你有办法这样做时

      (foo ?? defaultFoo).bar
    

    但这意味着你必须有一个与 foo 相同时间的对象,并按照你想要的方式设置它的栏。

    【讨论】:

    • 如果foo 是像(foo as string).Length 这样的表达式呢?
    • @Poma,你是什么意思 foo 是一个表达式?在这种情况下,表达式正是您使用的 foo 。但是,您的情况不起作用,因为 .Length 是一个不能为空的 int。
    【解决方案3】:

    不,目前 C# 中没有这样的运算符(访问成员或返回默认值)。当然,您可以编写一个方法来执行此操作:

    public static TMember MemberOrDefault<T, TMember>(T obj, 
                                                      Func<T, TMember> accessor, 
                                                      TMember @default) {
        return obj == null ? @default : accessor(obj);
    }
    
    string a = MemberOrDefault(someVeryLongVariableName, v => v.bar, "");
    

    但是请注意,如果 someVeryLongVariableName.bar 为 null(这可能是您想要的,也可能不是您想要的),这仍然会返回 null。

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2023-03-24
      • 1970-01-01
      • 2014-10-25
      • 2012-01-27
      • 1970-01-01
      相关资源
      最近更新 更多