C#6布尔和新的null检查用?返回什么

本文关键字:返回 什么 检查 null 布尔 C#6 | 更新日期: 2023-09-27 18:28:36

C#6.0代码:

public bool HasLeaderOtherThanSelf
{
    return LeaderMembership?.AthleteId != App.CurrentAthlete.Id;
}

在C#4中实现它的正确方法是什么?

如果LeaderMembership为空,返回nullfalse

C#6布尔和新的null检查用?返回什么

在C#4.0中:

public bool HasLeaderOtherThanSelf
{
    return LeaderMembership != null && LeaderMembership.AthleteId != App.CurrentAthlete.Id;
}

public bool? HasLeaderOtherThanSelf
{
   if(LeaderMembership == null)
   {
      return null;
   }
   return LeaderMembership.AthleteId != App.CurrentAthlete.Id;
}

您将返回false

public bool HasLeaderOtherThanSelf
{
    if (LeaderMembership != null)
       return LeaderMembership.AthleteId != App.CurrentAthlete.Id;
    return false;
}

可以简化为:

public bool HasLeaderOtherThanSelf
{
    return LeaderMembership != null && LeaderMembership.AthleteId != App.CurrentAthlete.Id;
}

如果LeaderMembership为null,则LeaderMembership?.AthleteId的结果将是类型为nullable int的null值(假设AthleteId是整数)。

假定App.CurrentAthlete.Id也是一个整数,因此类型为null的int的null值与int的比较将为false。

像这样:

public bool HasLeaderOtherThanSelf
{
    if(LeaderMembership != null)
       return LeaderMembership.AthleteId != App.CurrentAthlete.Id;
    return false;
}

或者,如果您希望能够返回null,则应将HasLeaderOtherThanSelf类型更改为Nullable Boolbool?):

public bool? HasLeaderOtherThanSelf
{
    if(LeaderMembership != null)
       return LeaderMembership.AthleteId != App.CurrentAthlete.Id;
    return null;
}

尝试扩展

public static TValue GetOrDefault<TObject, TValue>(this TObject obj, Func<TObject, TValue> getter, TValue defaultValue = default(TValue))
            where TObject : class
        {
            return obj == null ? defaultValue : getter(obj);
        }

您可以将其用作:

public bool HasLeaderOtherThanSelf
{
    return LeaderMembership.GetOrDefault(x => x.AthleteId) != App.CurrentAthlete.Id;
}

或者如果您想返回null:

public static TValue? GetOrDefault<TObject, TValue>(this TObject obj, Func<TObject, TValue> getter, TValue? defaultValue = default(TValue?))
    where TObject : class
    where TValue : struct
{
    return obj == null ? defaultValue : getter(obj);
}

您的C#代码转换为

public bool HasLeaderOtherThanSelf
{
    var leaderMembership = LeaderMembership;
    return (leaderMembership == null ? default(int?) : leaderMembership.AthleteId)
      != App.CurrentAthlete.Id;
}

请注意,您的代码只读取LeaderMembership一次,为了准确地模拟C#<6,您需要一个额外的局部变量。

请注意,如果LeaderMembershipnull,而App.CurrentAthlete.Id不是null,那么现有代码将返回true,但对于这种情况,大多数其他答案都返回falsefalse可能是一个更好的答案,但不是对现有代码的准确翻译。

C# 4中,它看起来像:

public bool HasLeaderOtherThanSelf
{
    return LeaderMembership != null && LeaderMembership?.AthleteId != App.CurrentAthlete.Id;
}

但使用"硬编码"不是一个好的做法)最好这样做:

第一个变体

public bool IsNullOrEquivalent<T>(T target, Func<T, bool> comparer)
        where T : class
{
    return target == null
        && comparer(target);
}

你可以像一样使用

var result = new NonExtensionComparer().IsNullOrEquivalent(LeaderMembership, e => e.AthleteId == App.CurrentAthlete.Id);

第二变量(扩展)

public static bool IsNullOrEquivalent<T>(this T target, Func<T, bool> comparer)
{
    return target == null
        && comparer(target);
}

用途:

var result = LeaderMembership.IsNullOrEquivalent(e => e.AthleteId == App.CurrentAthlete.Id);