一点点字符串
本文关键字:字符串 一点点 | 更新日期: 2023-09-27 18:19:25
更新:
<小时>当数据库通过标量返回值时,它将始终是object
。因此,当返回值时,您应该对类型有一个先入为主的概念。当您有一个传递两个参数的SELECT
时,为什么要使用ToString();
。
就好像它不存在一样,它总是抛出一个null
。因此,在我的重构中,我相信as
将是合适的方法。由于ToString()
会抛出一个错误——那么它可以与cast
的什么形式相比较呢?
我有一些代码正在维护中,但在一次重构中,我发现了一个连接到ExecuteScalar
的ToString()
。我的问题是,ToString()
的用法是否等同于:
(string)command.ExecuteScalar();
或者它会代表这个:
command.ExecuteScalar() as string;
显然,as string
会优雅地失败,而cast (string)
实际上会落入InvalidCastException
。所以当你打电话时:
command.ExecuteScalar().ToString();
它试图采用casting
的哪种方法?
不,这并不意味着这两者中的任何一个——它只是意味着对任何值调用ToString()
。
特别是,如果值是而不是字符串,它无论如何都会将其转换为字符串,而string
将因InvalidCastException
而失败,as
将返回null。
例如:
object x = 10;
string a = x.ToString(); // "10"
string b = x as string; // null
string c = (string) x; // Bang
当然,如果调用的目标是null
引用,那么ToString()
仍然可以抛出异常。
就我个人而言,如果你知道结果类型应该是什么,我建议使用强制转换——尽管ExecuteScalar
的结果通常是数值(例如计数)而不是字符串。
是的,这意味着如果你错了,就会抛出一个异常——但如果你的查询无论如何都没有按照它的意图进行,那么由于异常而停止可能比用虚假的世界观进行要好。(有关这种态度的更多信息,请参阅我关于选角与as
的博客文章。)
两者都不是,因为Object.ToString()
将返回对象的字符串表示。不管查询返回的是varchar
还是int
。
如果command.ExecuteScalar()
返回null
,那么它将类似于null.ToString()
,这将破坏您的生产代码。
(string)command.ExecuteScalar()
也会破坏您的代码。
我建议使用线下
var result = command.ExecuteScalar() as string;
if(result != null)
{
//your code
}
让我们考虑一下。
当你执行command.ExecuteScaler()时,在很多情况下,你会得到基于提供程序的返回和对象
发生的是操作顺序触发
- Command.ExecuteScaler()获取并返回对象
- 我们假设他是一个整数,如果我们得到这个整数
- To String被调用,它是在int32对象本身中定义的
- 你可以取回里面确定的绳子
在大多数情况下,toString并不意味着抛出异常,如果链中没有人实现,那么您只需要返回对象类型,即对象上的实现。
既然如此,在int的情况下,它可能就是上面的那个。注意,如果执行标量返回null,字符串将出错,因为null不是对象。
希望能有所帮助。
附言:如果你告诉我ExecuteScalar的对象类型,我可以给你一个更好的答案。