关于c#:Cast中的内容有所不同


What in the Cast, is different

本问题已经有最佳答案,请猛点这里访问。

这可能是一个很小的问题,我见过几个不同类型的演员。

  • 有什么区别?
  • 一个比另一个好吗(表演)?
  • 这只是偏好问题,代码易读性问题吗?

例子一:

1
command.ExecuteScalar() as string;

例子二:

1
(string)command.ExecuteScalar();

两者对ExecuteScalar()的影响不同,所以问题是,当与数据库交互时,一个比另一个更理想?


第一个(command.ExecuteScalar() as string;将在运行时尝试将ExecuteScalar()的结果转换为字符串。如果生成的类型不是string,您将收到null。as关键字还只执行引用转换、可为空的转换和装箱转换,因此不能将其直接用于不可为空的值类型。

第二个((string)command.ExecuteScalar();将直接转换为string,如果结果值不是string则提高InvalidCastException

Is one better than another (Performance)?

一般来说,如果您知道结果总是一个字符串,那么使用第二个选项应该提供(无意义的)更好的性能。

Is it just a matter of preference, code legibility?

这就是我做出更大区别的地方。使用as表明结果可能不是字符串,您将处理null检查。使用直接强制转换表示您知道它始终是一个字符串,其他任何内容都是一个错误,应该引发异常。

在我看来,这应该是选择的决定因素,因为它直接在代码中显示了您的意图。


如果无法强制转换command.ExecuteScalar()(string)command.ExecuteScalar()将抛出异常。

command.ExecuteScalar() as string只返回空值。