gpt4 book ai didi

c# - string.IsNullOrEmpty() 似乎不适用于类中类中的字符串

转载 作者:行者123 更新时间:2023-11-30 20:10:18 24 4
gpt4 key购买 nike

首先,我想我知道发生了什么,但我想我会在这里提出这个问题进行一些讨论,看看是否有人对此有与我的想法不同的“答案”。因为,这对我来说完全没有意义。

我发现,在为异常创建错误日志时,我这样做了,但它不起作用:

catch( Exception ex )
{
LogException( ex.Message );
if ( !string.IsNullOrEmpty( ex.InnerException.Message ) )
{
LogInnerException( ex.InnerException.Message );
}
}

你瞧,当我运行它时,我经常会遇到 NullReferenceException。嗯?

我正在检查 null,对吗?

现在,我必须使用这个:

   if ( ex.InnerException != null && !string.IsNullOrEmpty( ex.InnerException.Message ) 

但这似乎违反直觉,也适得其反。因为,哎呀,如果我这样做:

   if ( !string.IsNullOrEmpty( null ) )

这根本不会给我带来任何问题。如果 ex.InnerException 为 null,那么 ex.InnerException.Message 肯定为 null,对吗?

显然不是。

我写了一个完整的控制台应用程序来重现这个。如果你

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace stringisnullorempty
{
class Program
{
static void Main( string[] args )
{
if ( !string.IsNullOrEmpty( null ) )
{
Console.WriteLine( "Ha ha ha, right...." );
}

MyBClass bClass = new MyBClass();
bClass.BClassName = "Some B Class Name";
if ( !string.IsNullOrEmpty( bClass.AClass.AString ) ) //<== Exception occurs here.
{
Console.WriteLine( bClass.AClass.AString );
}
}
}

public class MyAClass
{
private string aString;
public string AString
{
get
{
return aString;
}
set
{
aString = value;
}
}

private int aValue;
public int AValue
{
get
{
return aValue;
}
set
{
aValue = value;
}
}

public MyAClass() { }
}

public class MyBClass
{
private MyAClass aClass;
public MyAClass AClass
{
get
{
return aClass;
}
set
{
aClass = value;
}
}

private string bClassName;
public string BClassName
{
get
{
return bClassName;
}
set
{
bClassName = value;
}
}
public MyBClass() { }
}
}

我认为正在发生的事情是代码在尝试处理 IsNullOrEmpty 之前处理 ex.InnerException.Message。由于 ex.InnerException 为空,我们在尝试访问 ex.InnerException.Message 时遇到异常。

不过我想知道,我需要全面检查吗? ex.InnerException != null 就足够了吗?如果我们有一个内部异常,我们是否总是有一条与之关联的消息?

谢谢。

最佳答案

当您调用 ex.InnerException.Message 时,不是消息为 null,而是 InnerException 对象。

这样想:

string temp = ex.InnerException.Message
// ^ the error is on this dot.
if (string.IsNullOrEmpty(temp))
{
...
}

要准确匹配你想做的事情,只需使用这个:

catch (Exception ex)  // PLEASE catch something more specific.
{
LogException(ex.Message);
if (ex.InnerException != null)
{
LogInnerException(ex.InnerException.Message);
}
}

为了解决这个问题,我以前用过这个方法:

public Exception GetInnermost(Exception ex){    while (ex.InnerException != null) ex = ex.InnerException;    return ex;}

ex.GetBaseException()

关于c# - string.IsNullOrEmpty() 似乎不适用于类中类中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com