ToString Convert.ToString和(string)区别

本文介绍了四种将对象转换为字符串的方法:obj.ToString、Convert.ToString、(string)obj和obj as string,并对比了它们之间的区别及适用场景。
通常object到string有四种方式:(假设有object obj)obj.ToString,Convert.ToString,(string)obj,obj as string
他们都能将object对象转换成string对象。我就讲讲他们的异同以及在实际中应该使用哪个。

前两个方法通常是由别的对象得到string对象,它们间的区别只表现在要转换的对象为null时,如果obj为null,调用obj.ToString方法会导致NullReferenceException异常,调用Convert.ToString不会抛出异常而返回一个null。


用强制转换(string)obj要求obj的运行时类型必须是string。如果不是,就会抛出异常。用as方法则会相对平稳,当obj的运行时类型不是string时会返回null而不抛出异常。

所以在通常在我们需要得到某个对象的string表达形式时,我们应该使用ToString和Convert.ToString,这时候你就得根据情形选一个,假如你能保证你的对象不为null,则两个差不多。如果有可能为null,你就应该用Convert.ToString,如果你希望它为null的时候抛出异常,那么当然可以选择.ToString。

-------------------------------------------分界线---------------------------------------------------------------------------------------------------

补充:

通常较常用的数据间转换是parse()和toString()

前者是把字符串转成数值,而后者相反。由于toString()是Object中的方法,因此 所有类都会有自己的toString()方法,只是看不同的类是否有重新复写。而你所调用的ToString()方法,是调用示例所属类的ToString()方法。

一般(String)方法,也就是强制转型,是我们明明知道“谁是谁”的时候用到。多出现在继承inheritance的例子中。比如,Dog类继承Animal类,当我们需要upcast或downcast的时候(泛化和聚化)会用到强制转型。因为我们很确定,dog就是animal。而向下转型的时候,比如在一个Array里面,我们要存入一组数据,为了保证所有数据都能够存入我们往往会对这个数组存数数据的类型扩大化,比如都扩大到Animal。而在我们取数据的时候,我们很确定第二个位置就是一个Cat类型的实例,这个时候(也就是DownCast时),我们就回强制转型(Cat)。

强制转型相比Something As String的方法要强烈,如果转型不成功会直接抛出异常,而后者只是返回一个null值。


(转载自http://hi.baidu.com/zhaohuang1201/blog/item/19bb5d0876a119c73ac7634f.html)

### C# 中 `Convert.ToString` 的性能分析 在 C# 编程语言中,`Convert.ToString` 是一种用于将对象转换为其字符串表示形式的方法。此方法内部会调用目标类型的 `ToString()` 方法来完成实际的转换操作[^1]。 #### 性能开销分析 1. **基础实现机制** 当调用 `Convert.ToString(object value)` 时,如果传入的对象实现了 `IConvertible` 接口,则优先通过该接口执行转换逻辑;否则,它会尝试调用对象自身的 `ToString()` 方法[^2]。因此,在大多数情况下,`Convert.ToString` 直接调用 `object.ToString()` 的性能差异可以忽略不计。 2. **特殊情况下的额外开销** 如果输入参数为 null 或者是一个基本数据类型(如整数、浮点数),则 `Convert.ToString` 需要进行一些额外的检查处理工作。例如: - 对于数值类型,可能涉及格式化选项的选择; - 对于布尔值或其他特殊类型,可能会有默认格式化的附加成本。 这些额外的操作可能导致轻微的性能下降,但在绝大多数场景下仍然可以接受[^3]。 3. **对比其他替代方案** 使用 `string.Format` 或字符串插值表达式通常会产生更大的内存分配压力以及更高的 CPU 占用率,因为它们不仅完成了简单的类型转换还构建了一个新的复合字符串实例。相比之下,单独使用 `Convert.ToString` 更加高效且轻量级[^4]。 以下是两种常见方式的时间消耗比较测试代码: ```csharp using System; using System.Diagnostics; class Program { static void Main(){ Random rand = new(); Stopwatch sw = new(); const int iterations = 1_000_000; // Test Convert.ToString performance object[] dataForConversion = Enumerable.Range(0,iterations).Select(_=>rand.NextDouble()).ToArray(); sw.Restart(); foreach(var item in dataForConversion){ _=Convert.ToString(item); } Console.WriteLine($"Time taken by Convert.ToString:{sw.ElapsedMilliseconds}ms"); // Test direct ToString method call performance sw.Restart(); foreach(var item in dataForConversion){ _=(item as IFormattable)?.ToString(null,CultureInfo.InvariantCulture)??item?.ToString(); } Console.WriteLine($"Time taken by Direct toString calls :{sw.ElapsedMilliseconds}ms"); } } ``` 运行以上程序可以帮助开发者直观理解两者之间的效率差距。 ### 结论 总体而言,除非是在极端高频次循环运算环境中或者对毫秒级别延迟敏感的应用场合才需要注意优化掉这些微不足道的差别外,日常开发过程中无需过分担忧选用哪种途径来做简单类型到字符串的变化动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值