是使用null值调用方法还是提供null引用异常?
MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,我永远不需要检查我的'this'参数是否为null?
它最近向我指出,各种LINQ的扩展方法(如Where,Select等)返回IEnumerable<T>,恰巧也有IDisposable.以下评估结果True
new int[2] {0,1}.Select(x => x*2) is IDisposable
Run Code Online (Sandbox Code Playgroud)
我是否需要处理Where表达式的结果?
每当我打电话给一个方法返回时IEnumerable<T>,我(可能)接受在我完成它时调用dispose的责任吗?
我知道一般空列表比NULL更喜欢.但我将返回NULL,主要有两个原因
??之后很容易执行操作以获得返回值.对于字符串,我们有IsNullOrEmpty.有没有C#本身为List或IEnumerable做同样的事情?
方法返回一个序列,IEnumerable<T>您现在想要检查它是否为空.你怎么建议这样做?我正在寻找良好的可读性和良好的性能.
第一种也是最明显的方法是检查计数是否大于零:
if(sequence.Count() == 0)
Run Code Online (Sandbox Code Playgroud)
具有良好的可读性,但性能可怕,因为它必须实际完成整个序列.
我有时使用的方法如下:
if(!sequence.Any())
Run Code Online (Sandbox Code Playgroud)
这并不是(据我所知)必须经历整个序列,但可读性有点倒退和尴尬.(读好了很多,如果我们检查的顺序是不是空的,虽然).
另一种选择是First在try-catch中使用,如下所示:
try
{
sequence.First();
}
catch(InvalidOperationException)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
不是一个非常漂亮的解决方案,也可能更慢,因为它使用异常和东西.FirstOrDefault当然可以通过使用来防止这种情况,但如果序列中的第一项实际上是默认值,则会出现大问题;)
那么,检查序列是否为空的任何其他方法?你经常使用哪一个?你建议使用哪一种?
注意:为了获得最佳的可读性,我可能会将上述一个片段放在IsEmpty扩展方法中,但我仍然很好奇,因为我必须在该方法中做一些事情:p
我知道在大多数情况下它可能无关紧要/影响性能,但我讨厌IEnumerable做到和做的想法.Count().是否有一个IsEmpty或NotEmpty或一些功能?(类似于stl empty())
在null对象上调用Any()时,它会在C#中抛出ArgumentNullException.如果对象为null,那么肯定没有'any',它应该返回false.
为什么C#以这种方式运行?
通常在C#中我必须这样做
if(x.Items!=null && x.Items.Any())
{ .... }
Run Code Online (Sandbox Code Playgroud)
收藏品有捷径吗?
检查集合是否有物品的最佳做法是什么?
这是我的一个例子:
var terminalsToSync = TerminalAction.GetAllTerminals();
if(terminalsToSync.Any())
SyncTerminals(terminalsToSync);
else
GatewayLogAction.WriteLogInfo(Messages.NoTerminalsForSync);
Run Code Online (Sandbox Code Playgroud)
该GetAllTerminals()方法将执行一个存储过程,如果我们返回一个结果(Any()is true),SyncTerminals()将循环遍历这些元素; 从而再次枚举它并第二次执行存储过程.
避免这种情况的最佳方法是什么?
我想要一个可以在其他情况下使用的好解决方案; 可能没有把它转换成List.
提前致谢.
我有以下代码,我的同事告诉我这是不正确的,如果我的变量为null将崩溃:
List<FSKUser> users = null;
if (users == null || users.Count() == 0)
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
显然这=null只是为了测试目的.但是,当我运行此代码时,它正确运行并返回false.
我正在检查一种安全正确的检查方式吗?
看一下这段代码:
var categories = tokens.SelectMany(x => x.Categories);
if (categories != null)
{
if (categories.Contains("interp")) //null ref exception
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在类别中查找“interp”字符串时,出现空引用异常。所以看来“类别!= null”不起作用。
我找到了一些建议(这里How to check if IEnumerable is null orempty?),但它们涉及使用.Any()。但它只会使异常更早地准确(使用 .Any() 时)。甚至 ?.Any() 也会引发异常。
有任何想法吗?
String有一个方便的String.IsNullOrEmpty方法,用于检查字符串是否为null或长度为零.在开箱即用的.net中有类似的东西吗?
c# ×10
ienumerable ×6
linq ×5
.net ×4
null ×2
collections ×1
dispose ×1
object ×1
parameters ×1