dev*_*per 196 c# null nullreferenceexception
我想阻止对象的进一步处理,如果它是null.
在下面的代码中,我通过以下任一方法检查对象是否为null:
if (!data.Equals(null))
Run Code Online (Sandbox Code Playgroud)
和
if (data != null)
Run Code Online (Sandbox Code Playgroud)
不过,我收到NullReferenceException的dataList.Add(data).如果对象为null,则它应该永远不会进入if-statement!
因此,我问这是否是检查对象是否为null的正确方法:
public List<Object> dataList;
public bool AddData(ref Object data)
bool success = false;
try
{
// I've also used "if (data != null)" which hasn't worked either
if (!data.Equals(null))
{
//NullReferenceException occurs here ...
dataList.Add(data);
success = doOtherStuff(data);
}
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
return success;
}
Run Code Online (Sandbox Code Playgroud)
如果这是检查对象是否为null的正确方法,那么我做错了什么(如何防止对对象进一步处理以避免NullReferenceException)?
Jon*_*Jon 235
不是data那样null,但是dataList.
你需要创建一个
public List<Object> dataList = new List<Object>();
Run Code Online (Sandbox Code Playgroud)
更好的是:因为它是一个领域,所以要做到private.如果没有什么可以阻止你的话,那就去做吧readonly.只是好习惯.
在旁边
检查无效的正确方法是if(data != null).对于参考类型,这种检查无处不在; 甚至Nullable<T>覆盖等于运算符,以便nullable.HasValue在检查无效时更方便地表达.
如果你这样做,if(!data.Equals(null))你会得到一个NullReferenceExceptionif data == null.这是一种滑稽,因为避免这种异常首先是目标.
你也是这样做的:
catch (Exception e)
{
throw new Exception(e.ToString());
}
Run Code Online (Sandbox Code Playgroud)
这绝对不是好事.我可以想象你把它放在那里只是为了你可以在方法内部进入调试器,在这种情况下忽略这一段.否则,不要抓住异常.如果你这样做,只需使用它们重新抛出它们throw;.
Jow*_*wen 53
C#6有monadic null检查 :)
之前:
if (points != null) {
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
Run Code Online (Sandbox Code Playgroud)
后:
var bestValue = points?.FirstOrDefault()?.X ?? -1;
Run Code Online (Sandbox Code Playgroud)
kof*_*fus 44
在C#7中最好的是
if (obj is null) ...
这将忽略对象定义的任何==或!=(除非您当然要使用它们......)
如果不相等,你可以if (obj is object)(丑陋)
glo*_*rob 27
您的dataList为null,因为它尚未实例化,根据您发布的代码判断.
尝试:
public List<Object> dataList = new List<Object>();
public bool AddData(ref Object data)
bool success = false;
try
{
if (!data.Equals(null)) // I've also used if(data != null) which hasn't worked either
{
dataList.Add(data); //NullReferenceException occurs here
success = doOtherStuff(data);
}
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
return success;
Run Code Online (Sandbox Code Playgroud)
}
gat*_*ich 18
[编辑反映@ kelton52的暗示]
最简单的方法就是做 object.ReferenceEquals(null, data)
由于(null==data)不保证工作:
class Nully
{
public static bool operator ==(Nully n, object o)
{
Console.WriteLine("Comparing '" + n + "' with '" + o + "'");
return true;
}
public static bool operator !=(Nully n, object o) { return !(n==o); }
}
void Main()
{
var data = new Nully();
Console.WriteLine(null == data);
Console.WriteLine(object.ReferenceEquals(null, data));
}
Run Code Online (Sandbox Code Playgroud)
生产:
将''与'Nully'进行比较
真正
假
chi*_*s0v 15
从C# 9 开始,你可以做
if (obj is null) { ... }
Run Code Online (Sandbox Code Playgroud)
对于非空使用
if (obj is not null) { ... }
Run Code Online (Sandbox Code Playgroud)
如果您需要覆盖此行为==,请!=相应地使用。
不,你应该使用!=.如果data实际上为null,那么您的程序将NullReferenceException因尝试调用该Equals方法而崩溃null.还要意识到,如果您特别想要检查引用相等性,那么您应该使用该Object.ReferenceEquals方法,因为您永远不知道如何Equals实现.
您的程序崩溃,因为dataList您从未初始化它是null.
在这种情况下的问题不是datanull.它dataList本身就是空的.
在您声明的位置,您dataList应该创建一个新List对象并将其分配给变量.
List<object> dataList = new List<object>();
Run Code Online (Sandbox Code Playgroud)
使用 c#9 (2020),您现在可以使用以下代码检查参数是否为空:
if (name is null) { }
if (name is not null) { }
Run Code Online (Sandbox Code Playgroud)
您可以在此处获得更多信息
除了@Jose Ortega答案外,它更好地用于扩展方法
public static bool IsNull(this object T)
{
return T == null;
}
Run Code Online (Sandbox Code Playgroud)
并对IsNull所有对象使用方法,例如:
object foo = new object(); //or any object from any class
if (foo.IsNull())
{
// blah blah //
}
Run Code Online (Sandbox Code Playgroud)
从C# 8 开始,您可以使用“空”属性模式(使用模式匹配)来确保对象不为空:
if (obj is { })
{
// 'obj' is not null here
}
Run Code Online (Sandbox Code Playgroud)
这种方法意味着“如果对象引用某物的实例”(即它不为空)。
你可以把这看作是:的反面if (obj is null)...。当对象不引用某物的实例时,它将返回 true。
有关 C# 8.0 模式的更多信息,请阅读此处。
| 归档时间: |
|
| 查看次数: |
784569 次 |
| 最近记录: |