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
为空,返回null
或false
?
在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 Bool
(bool?
):
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,您需要一个额外的局部变量。
请注意,如果LeaderMembership
是null
,而App.CurrentAthlete.Id
不是null,那么现有代码将返回true
,但对于这种情况,大多数其他答案都返回false
。false
可能是一个更好的答案,但不是对现有代码的准确翻译。
在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);