我喜欢null-coalescing运算符,因为它可以很容易地为可空类型分配默认值.
int y = x ?? -1;
Run Code Online (Sandbox Code Playgroud)
这很好,除非我需要做一些简单的事情x.例如,如果我想检查Session,那么我通常最终不得不写更详细的东西.
我希望我能做到这一点:
string y = Session["key"].ToString() ?? "none";
Run Code Online (Sandbox Code Playgroud)
但是你不能因为在.ToString()null检查之前调用了gets,所以如果Session["key"]为null 则它会失败.我最终这样做了:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Run Code Online (Sandbox Code Playgroud)
在我看来,它比三线替代方案更有效,也更好:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Run Code Online (Sandbox Code Playgroud)
尽管有效,但如果有更好的方法,我仍然很好奇.似乎无论我总是要引用Session["key"]两次; 一次检查,再次检查.有任何想法吗?
什么是?下面的C#代码说明什么?
var handler = CallBack;
handler?.Invoke();
Run Code Online (Sandbox Code Playgroud)
我已经读过你可以使用a ?之前的类型来表明它是一个可以为空的类型.这是做同样的事吗?
如何在深层lamda表达式中检查空值?
比方说,我有一个嵌套了几层深度的类结构,我想执行以下lambda:
x => x.Two.Three.Four.Foo
Run Code Online (Sandbox Code Playgroud)
如果Two,Three或Four为null,我希望它返回null,而不是抛出System.NullReferenceException.
public class Tests
{
// This test will succeed
[Fact]
public void ReturnsValueWhenClass2NotNull()
{
var one = new One();
one.Two = new Two();
one.Two.Three = new Three();
one.Two.Three.Four = new Four();
one.Two.Three.Four.Foo = "blah";
var result = GetValue(one, x => x.Two.Three.Four.Foo);
Assert.Equal("blah", result);
}
// This test will fail
[Fact]
public void ReturnsNullWhenClass2IsNull()
{
var one = new One();
var result = GetValue(one, x => x.Two.Three.Four.Foo);
Assert.Equal(null, result);
}
private TResult GetValue<TModel, TResult>(TModel model, …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个通用扩展方法,让我这样做:
this.startDate = startDateXAttribute.NullOrPropertyOf<DateTime>(() =>
{
return DateTime.Parse(startDateXAttribute.Value);
});
Run Code Online (Sandbox Code Playgroud)
NullOrPropertyOf()将返回null如果它是一个上使用的null对象(例如,如果startDateXAttribute是null),或返回的结果Func,如果它不为空.
这种扩展方法会是什么样的?
寻找一些最佳实践指导.假设我有一行代码如下:
Color color = someOrder.Customer.LastOrder.Product.Color;
Run Code Online (Sandbox Code Playgroud)
Customer,LastOrder,Product和Color可以null在正常条件下.但是,如果路径中的任何一个对象为null,我希望color为null; 为了避免空引用异常,我需要检查每个对象的空条件,例如
Color color = someOrder == null ||
someOrder.Customer == null ||
someOrder.Customer.LastOrder == null ||
someOrder.Customer.Product == null ?
null : someOrder.Customer.LastOrder.Product.Color;
Run Code Online (Sandbox Code Playgroud)
或者我可以这样做
Color color = null;
try {color = someOrder.Customer.LastOrder.Product.Color}
catch (NullReferenceException) {}
Run Code Online (Sandbox Code Playgroud)
第一种方法显然有效,但编码和更难阅读似乎更乏味.第二种方法稍微容易一点,但对此使用异常处理可能不是一个好主意.
是否有另一种检查空值的快捷方式,并在必要时将null指定为颜色?或者在使用这种嵌套引用时如何避免NullReferenceExceptions的任何想法?
我有几个由API返回的普通旧C#对象,并且在其中嵌套了几层POCO.我需要访问这些结构中包含的字段,但是因为当数据丢失时,API将这些嵌套对象保留为null,我发现自己必须进行大量的空检查才能进入我真正想要的字段.
if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) { ... }
Run Code Online (Sandbox Code Playgroud)
我提出的最短形式是使用三元运算符.
obj != null && obj.Inner != null && obj.Inner.Innerer != null ? obj.Inner.Innerer.Field : null;
Run Code Online (Sandbox Code Playgroud)
C#有没有办法做到这一点,而不必写出所有这些比较?我真的很喜欢简短的东西:
obj.Inner.Innerer.Field ?? null;
Run Code Online (Sandbox Code Playgroud)
但是只检查Field为null.
我必须在这样的深对象模型中进行查找:
p.OrganisationalUnit.Parent.Head.CurrentAllocation.Person;
Run Code Online (Sandbox Code Playgroud)
无论如何要评估这个并且如果任何链为null(organizationalunit,parent,head等)则返回null,而不必执行
if (p.org == null && p.org.Parent == null && p.org.Parent.Head . . .
Run Code Online (Sandbox Code Playgroud) 我最近向一位同事发了言:
永远不 应该明确捕获NullReferenceExceptions
我用了永远......嗯这个词.我自己从未见过适当的用例来抓住它们,但我想检查一下是否还有其他用户?
毕竟,从来没有这么强的话语.....
我发现我经常需要链接在一起工作的函数Option并返回不同的函数,Option如下所示:
if(foo.isDefined) someFunctionReturningOption(foo.get) else None
Run Code Online (Sandbox Code Playgroud)
有更清洁的方法吗?对于更复杂的变量,这种模式变得非常冗长.
我在表单处理代码中看到了一些必须处理可选数据的问题.None如果值是None或某些转换(可能会失败),它将插入,如果有一些值.
C# 有有用的Null Conditional Operator。在这个答案中也有很好的解释。
我想知道当我的对象是动态/扩展对象时是否可以进行类似的检查。让我向您展示一些代码:
鉴于此类层次结构
public class ClsLevel1
{
public ClsLevel2 ClsLevel2 { get; set; }
public ClsLevel1()
{
this.ClsLevel2 = new ClsLevel2(); // You can comment this line to test
}
}
public class ClsLevel2
{
public ClsLevel3 ClsLevel3 { get; set; }
public ClsLevel2()
{
this.ClsLevel3 = new ClsLevel3();
}
}
public class ClsLevel3
{
// No child
public ClsLevel3()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我执行这种链式空检查,它会起作用
ClsLevel1 levelRoot = new ClsLevel1();
if (levelRoot?.ClsLevel2?.ClsLevel3 != null) …Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用了很多数据库数据,这些数据是在不同的类中导出的.例如,我有
transaction.Layout.Multimedia.Images.first();
Run Code Online (Sandbox Code Playgroud)
问题是这些属性不一定可用.
因此,有可能transaction.Layout为null,可能transaction.Layout.Multimedia为null,依此类推.
我目前在每个房产都使用它:
if (transaction.Layout != null)
{
if (transaction.Layout.Multimedia != null)
{
if (transaction.Layout.Multimedia.Images != null)
{
if (transaction.Layout.Multimedia.Images.count > 0)
{
var img = transaction.Layout.Multimedia.Images.first();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法可以检查所有父类以确保我需要的属性可用.这些不是我使用的唯一对象,还有其他对象也有完全不同的名称.
提前致谢
我想重构以下两行代码:
var myDbObject = service.GetObj(id);
name = myDbObject != null ? myDbObject.Name : "No name";
Run Code Online (Sandbox Code Playgroud)
如何避免使用辅助变量"myDbObject"?
我只用一行代码就可以做到这一点吗?
LINQ还有什么方法可以实现这个目的吗?
我不看的解决方案: