空字符串是空引用?

时间:2012-04-13 19:48:37

标签: c# string winforms nullreferenceexception versioninfo

为什么这段代码(在我的表单的_Load()事件中):

FileVersionInfo vi = FileVersionInfo.GetVersionInfo(_fullPath);
String VersionInfo = vi.FileVersion;
if (VersionInfo.Trim().Equals(String.Empty)) {
    VersionInfo = NO_VERSION_INFO_AVAILABLE;
}
textBoxVersionInfo.Text = VersionInfo;

...当VersionInfo == ""为真时,给我以下错误消息?

  

System.NullReferenceException未处理     Message =对象引用未设置为对象的实例。*

5 个答案:

答案 0 :(得分:7)

您应该在此处使用String.IsNullOrEmpty方法。 See MSDN

if (String.IsNullOrEmpty(VersionInfo)) {
    VersionInfo = NO_VERSION_INFO_AVAILABLE;}

答案 1 :(得分:5)

好吧,因为我在另一个问题上得到了一些荒谬的票数,所以这里又是一种更直率,更轻松的方式:

  • null代表对象的缺少 ;和
  • 所有字符串都是对象;从而
  • 没有任何长度的字符串,null ;从而
  • 空字符串永远不会null

就是这样,仅此而已。 检查堆栈跟踪和/或附加调试器以找出其中 null不< / em>一个空字符串)来自。

例外是使用expr.somePropertyFieldOrMethod expr评估null 1 的结果,因此 空引用 例外

(开发人员)的工作是找出哪个 exprnull,而不是等着看其他人的建议可能是错的。因此,在回答标题中的问题后,我将其视为“过于本地化”,这是唯一存在的问题。

(正如我之前的回答,我注意到textBoxVersionInfo null可能会导致此异常,即使VersionInfo == ""为真。另一种选择当然是 VersionInfo 代表空字符串。)


1 从技术上讲,这个例外可以任意提出,也许在扩展方法中是合理的。但是,大肆提高此异常是不是常见或良好实践,或者在.NET框架中找到,因此在调试时通常是一个不允许的原因。

答案 2 :(得分:2)

如果VersionInfo is NULL为真,则 VersionInfo.Trim()会出错。

请使用String.IsNullOrEmpty

如果VersionInfo为null,则可以使用

进行检查
if(VersionInfo == null)

String.IsNullOrEmpty(VersionInfo)

答案 3 :(得分:2)

有一种null - 安全的方法:而不是

VersionInfo.Trim().Equals(String.Empty)

string.IsNullOrWhiteSpace(VersionInfo)

如果VersionInfo为空,它不会崩溃,如果修剪VersionInfo导致空字符串,它将返回true。

答案 4 :(得分:1)

在您回复我的评论后,您知道VersionInfo为空。对Trim()的调用失败,因为它将在检查之前执行,如果它等于String.Empty

您应该使用(string.IsNullOrEmpty(VersionInfo) || VersionInfo.Trim().Length < 1)代替(string.IsNullOrWhiteSpace(VersionInfo),如果您使用的是.NET 4)。

修改

在看到您对另一个答案的回复后,您删除了Trim()并且它仍然无法正常工作......此时,它将是中断调用。尝试上面提到的代码,它应该可以正常工作。