What in the Cast, is different
这可能是一个很小的问题,我见过几个不同类型的演员。
- 有什么区别?
- 一个比另一个好吗(表演)?
- 这只是偏好问题,代码易读性问题吗?
例子一:
1
| command.ExecuteScalar() as string; |
例子二:
1
| (string)command.ExecuteScalar(); |
两者对ExecuteScalar()的影响不同,所以问题是,当与数据库交互时,一个比另一个更理想?
- as将优雅地失败。
- @基林托斯·埃多克斯1〔1〕。另外,你是如何评论的,你的代表不足50人。标记的对话是这样做的吗?
- 我终于可以发表评论了,它会自动将我的答案转换成评论,然后我就无法编辑/删除,因为我不能做评论。
第一个(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检查。使用直接强制转换表示您知道它始终是一个字符串,其他任何内容都是一个错误,应该引发异常。
在我看来,这应该是选择的决定因素,因为它直接在代码中显示了您的意图。
- 最好指出,只有当被强制转换为的类型已知为引用类型或可以为空的值类型时,as才有效。
- 在值类型的情况下,as将产生一个编译器错误(仅说明"它不起作用"的类型)
- @杰弗梅卡多刚刚编辑了该信息。
如果无法强制转换command.ExecuteScalar(),(string)command.ExecuteScalar()将抛出异常。
command.ExecuteScalar() as string只返回空值。