C# 转string类型,用tostring 好还是用as好
inti=3;用i.tostring()好还是用iasstring好。两个方法的效率有多大的差别...
int i = 3;
用 i.tostring()好还是用 i as string 好。两个方法的效率有多大的差别 展开
用 i.tostring()好还是用 i as string 好。两个方法的效率有多大的差别 展开
7个回答
展开全部
无论何时,正确的选择是用as运算符进行类型转换。因为比起盲目的强制转换它更安全,而且在运行时效率更高。用as和is运算符进行转换时,并不是对所有的用户定义的类型都能完成的。它们只在运行时类型和目标类型匹配的时候,转换才能成功。它们决不会构造一个新的对象来满足(转化)要求。
看一个例子。你写了一段代码,要转换一个任意类型的对象实例到一个MyType类型的实例。你是这样写代码的:
object o = Factory.GetObject( );
// Version one:
MyType t = o as MyType;
if ( t != null )
{
// work with t, it's a MyType.
} else
{
// report the failure.
}
或者你这样写:
object o = Factory.GetObject( );
// Version two:
try {
MyType t;
t = ( MyType ) o;
if ( t != null )
{
// work with T, it's a MyType.
} else
{
// Report a null reference failure.
}
} catch
{
// report the conversion failure.
}
你会同意第一种写法更简单更容易读。它没有try/catch结构,所以你可以同时避免(性能)开销和(多写)代码。我们注意到,强制转换的方法为了检测转换是否把一个null的对象进行强制转换,而不得不添加一个捕获异常的结构。null可以被转换为任意的引用类型,但as操作符就算是转化一个null的引用时,也会(安全的)返回一个null。所以当你用强制类型转换时,就得用一个try/catch结构来捕获转换null时的异常。用as进行转换的时就,就只用简单的检测一下转化后的实例不为null就行了。
(译注:被转换对象和转换后的结果都有可能为null,上面就是对这两种null进行了说明,注意区分。强制转换是不安全的,可能会有异常抛出,因此要用try/catch结构来保证程序正常运行,而as转换是安全的,不会有异常抛出,但在转换失败后,其结果为null)
看一个例子。你写了一段代码,要转换一个任意类型的对象实例到一个MyType类型的实例。你是这样写代码的:
object o = Factory.GetObject( );
// Version one:
MyType t = o as MyType;
if ( t != null )
{
// work with t, it's a MyType.
} else
{
// report the failure.
}
或者你这样写:
object o = Factory.GetObject( );
// Version two:
try {
MyType t;
t = ( MyType ) o;
if ( t != null )
{
// work with T, it's a MyType.
} else
{
// Report a null reference failure.
}
} catch
{
// report the conversion failure.
}
你会同意第一种写法更简单更容易读。它没有try/catch结构,所以你可以同时避免(性能)开销和(多写)代码。我们注意到,强制转换的方法为了检测转换是否把一个null的对象进行强制转换,而不得不添加一个捕获异常的结构。null可以被转换为任意的引用类型,但as操作符就算是转化一个null的引用时,也会(安全的)返回一个null。所以当你用强制类型转换时,就得用一个try/catch结构来捕获转换null时的异常。用as进行转换的时就,就只用简单的检测一下转化后的实例不为null就行了。
(译注:被转换对象和转换后的结果都有可能为null,上面就是对这两种null进行了说明,注意区分。强制转换是不安全的,可能会有异常抛出,因此要用try/catch结构来保证程序正常运行,而as转换是安全的,不会有异常抛出,但在转换失败后,其结果为null)
参考资料: 改善C#程序的50种方法
展开全部
值类型用tostring 引用类型as 没有试过 我都用的是 tostring方法 至于效率嘛 你自己用stopwatch 这个类 定义一个秒表 用10000个对象 看看 需要的时间是多少吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我首先试了十万次的tostring与as string,计算出的耗时都是1毫米以内,当到1亿次之后才得出差距
Stopwatch wat = new Stopwatch();
object x = "xx";
var xs = "";
wat.Start();
for (int i = 1; i < 100000000; i++)
{
xs = x.ToString();
}
wat.Stop();
Console.WriteLine("isDigit {0}:{1},{2}", x, wat.ElapsedMilliseconds, xs);
wat.Reset();
wat.Start();
for (int i = 1; i < 100000000; i++)
{
xs = x as string;
}
wat.Stop();
Console.WriteLine("isNumberic {0}:{1},{2}", x, wat.ElapsedMilliseconds, xs);
tostring为500ms,as string 为300ms,使用我觉得这两个东西效率差距可以基本忽略不计
Stopwatch wat = new Stopwatch();
object x = "xx";
var xs = "";
wat.Start();
for (int i = 1; i < 100000000; i++)
{
xs = x.ToString();
}
wat.Stop();
Console.WriteLine("isDigit {0}:{1},{2}", x, wat.ElapsedMilliseconds, xs);
wat.Reset();
wat.Start();
for (int i = 1; i < 100000000; i++)
{
xs = x as string;
}
wat.Stop();
Console.WriteLine("isNumberic {0}:{1},{2}", x, wat.ElapsedMilliseconds, xs);
tostring为500ms,as string 为300ms,使用我觉得这两个东西效率差距可以基本忽略不计
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ToString是所有类型都支持的方法,各自也可以有自己的实现
as是内置的类型转换,符只执行引用转换和装箱转换,因此适用范围要窄很多
如果你确定被转换的对象是string,那么首选as string,如果不确定就只能用ToString了
as是内置的类型转换,符只执行引用转换和装箱转换,因此适用范围要窄很多
如果你确定被转换的对象是string,那么首选as string,如果不确定就只能用ToString了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int i是值类型的,不支持装箱拆箱操作.没法用as 的.
i as string 会报语法错误.
i as string 会报语法错误.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询