C# Razor视图中的String.Trim()

C# Razor视图中的String.Trim(),c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,为什么String.Trim()在如下Razor视图中使用String.empty时会引发异常: console.log('@Model.Test.FirstOrDefault().Trim()'); console.log('@Model.Test.FirstOrDefault()?.Trim()'); (列表为空,因此我得到string.empty),然后: Server Error in '/' Application. Object reference not set to an i

为什么
String.Trim()
在如下Razor视图中使用
String.empty
时会引发异常:

console.log('@Model.Test.FirstOrDefault().Trim()');
console.log('@Model.Test.FirstOrDefault()?.Trim()');
(列表为空,因此我得到
string.empty
),然后:

Server Error in '/' Application.
Object reference not set to an instance of an object.
(...)'
Line 326:            console.log('@Model.Test.FirstOrDefault().Trim()');

如果列表如您所说为空,则不会得到
字符串。empty
而是null,因为空字符串列表的第一个元素的默认值为
null
,并且不能对null对象调用
.Trim()

如果您使用的是C#6,则可以执行以下操作:

console.log('@Model.Test.FirstOrDefault().Trim()');
console.log('@Model.Test.FirstOrDefault()?.Trim()');
请注意,在
.Trim()
之前添加了一个问号,该问号会将null签入,以便仅当左侧不为null时才会调用Trim

或者,您可以:

console.log('@(Model.Test.FirstOrDefault() ?? string.Empty).Trim()');

它使用null合并运算符显式地将null替换为
字符串.Empty
,并且在以前版本的C#

中可用,如果列表如您所说为空,则不会得到
字符串.Empty
,而是一个null,因为空字符串列表的第一个元素的默认值是
null
,并且不能对null对象调用
.Trim()

如果您使用的是C#6,则可以执行以下操作:

console.log('@Model.Test.FirstOrDefault().Trim()');
console.log('@Model.Test.FirstOrDefault()?.Trim()');
请注意,在
.Trim()
之前添加了一个问号,该问号会将null签入,以便仅当左侧不为null时才会调用Trim

或者,您可以:

console.log('@(Model.Test.FirstOrDefault() ?? string.Empty).Trim()');

它使用null合并运算符显式地将null替换为
字符串.Empty
,并且在以前版本的C 35;

中可用,您可能在某个地方有
null
。通过在c#6中使用
elvis
运算符,您可以轻松克服此问题:


您可能在某个地方有
null
。通过在c#6中使用
elvis
运算符,您可以轻松克服此问题:


您可能正在对null调用Trim最有可能的是
FirstOrDefault
生成的是
null
,而不是空字符串.console.log('result:'+'@Model.Institution.FirstOrDefault()');给我:'result:'在控制台
FirsOrDefault()
中,如果集合有一个空集,则返回null。在您的情况下,您正在对
FirstOrDefault()
返回的null调用
.Trim()
。您可能正在对null调用Trim,很可能
FirstOrDefault
正在生成
null
,而不是空字符串.console.log('result:'+'@Model.Institution.FirstOrDefault()');告诉我:'result:'in console
FirsOrDefault()
中如果集合的集合为空,则返回null,在您的情况下,您正在对
FirstOrDefault()
返回的null调用
.Trim()
。不要过度使用?。操作员-它可能导致错误代码。只有当你知道有一个空值需要用特定的方式处理时才使用它。我不认为这是过度使用?。界线很清楚。他想将字符串值用于某些内容,必须检查空值。Elvis运算符可以在不需要的情况下跳转到许多不需要的代码进行空值检查。您知道可能的空值在哪里(在
.FirstOrDefault()之后)
)您使用过它的其他地方没有被识别为返回值为null的地方,或者它是有用的,因为您强迫自己进入那个角落-它不(或永远不应该)返回null您不应该检查它,因为您将隐藏bug。你的回答和后续评论正好说明了为什么我认为在语言中添加这一内容是个坏主意。你过度使用它,你看不到你是。您所做的只是重新创建旧的VB OnErrorContinue场景。不要过度使用?。操作员-它可能导致错误代码。只有当你知道有一个空值需要用特定的方式处理时才使用它。我不认为这是过度使用?。界线很清楚。他想将字符串值用于某些内容,必须检查空值。Elvis运算符可以在不需要的情况下跳转到许多不需要的代码进行空值检查。您知道可能的空值在哪里(在
.FirstOrDefault()之后)
)您使用过它的其他地方没有被识别为返回值为null的地方,或者它是有用的,因为您强迫自己进入那个角落-它不(或永远不应该)返回null您不应该检查它,因为您将隐藏bug。你的回答和后续评论正好说明了为什么我认为在语言中添加这一内容是个坏主意。你过度使用它,你看不到你是。您所做的只是重新创建旧的VB场景。