当前位置:  开发笔记 > 编程语言 > 正文

当对象确实是一个字符串时,转换vs将对象转换为String

如何解决《当对象确实是一个字符串时,转换vs将对象转换为String》经验,为你挑选了5个好方法。

这不是一个真正的问题,但我很好奇.当我将一个字符串保存在一个DataRow中时,它会被转换为Object.当我想使用它时,我必须将其转换为ToString.据我所知,有几种方法可以做到这一点,首先是

string name = (string)DataRowObject["name"]; //valid since I know it's a string

另一个是:

string name = DataRowObject["name"].ToString();

我感兴趣的是两者有什么区别?第一个更有效率吗?(这只是一个推测,在我的脑海中ToString()方法是通过一些循环机制实现的,只是把它"变得"更快,但这只是一种"直觉"我有).

有没有更快/更优雅的方式这样做?

任何人都可以为我清除这个吗?



1> Adriaan Stan..:

这两个用于不同的目的.任何对象的ToString方法都应该返回该对象的字符串表示.如上所述,转换是完全不同的,'as'关键字执行条件转换.'as'关键字基本上表示"如果该对象是这种类型,请将此类型的引用提供给该对象",而ToString则说"给我一个该对象的字符串表示".结果在某些情况下可能是相同的,但两者绝不应该被认为是可以互换的,因为正如我所说,它们存在于不同的目的.如果您的意图是强制转换,则应始终使用强制转换,而不是ToString.

来自http://www.codeguru.com/forum/showthread.php?t=443873

另见http://bytes.com/groups/net-c/225365-tostring-string-cast



2> Andrew Hare..:

如果你知道它是一个String然后通过一切手段把它投入到String.转换对象比调用虚方法要快.

编辑:以下是一些基准测试的结果:

============ Casting vs. virtual method ============
cast 29.884 1.00
tos  33.734 1.13

我用Jon Skeet是BenchmarkHelper这样的:

using System;
using BenchmarkHelper;

class Program
{
    static void Main()
    {
        Object input = "Foo";
        String output = "Foo";

        var results 
           = TestSuite.Create("Casting vs. virtual method", input, output)
            .Add(cast)
            .Add(tos)
            .RunTests()
            .ScaleByBest(ScalingMode.VaryDuration);

        results.Display(ResultColumns.NameAndDuration | ResultColumns.Score,
                results.FindBest());
    }

    static String cast(Object o)
    {
        return (String)o;
    }

    static String tos(Object o)
    {
        return o.ToString();
    }
}

因此看起来铸造实际上比调用ToString().



3> Dzmitry Huba..:

基本上在你的情况下,最好保留类型转换,因为.ToString()可能会隐藏错误.例如,您的数据库架构已更改且名称不再是字符串类型,但使用.ToString()您的代码仍然有效.所以在这种情况下最好使用类型转换.

这是String.ToString()的实现 - 没什么特别的=)

public override string ToString()
{
    return this;
}



4> Anton Gogole..:

由于CLR必须执行各种运行时类型检查,因此向下转换是相对较慢的操作.然而,在此特定情形铸造string比调用更合适ToString()的一致性的缘故(你不能叫ToInt32object,而是投它int)和maintanability.



5> 小智..:

我想再发表一则评论

如果要使用强制转换:string name =(string)DataRowObject [“ name”],则将发生异常:如果记录中包含'System.DBNull'类型的对象,则无法将该类型转换为'System.String'。数据库表的值为空。

在这种情况下,您必须使用:字符串名称= DataRowObject [“名称”] .ToString()或

您必须检查空值,例如

if(!string.IsNullOrEmpty(DataRowObject["name"].ToString()))
{
string name = (string)DataRowObject["name"];
}
else
{
//i.e Write error to the log file
string error = "The database table has a null value";

}

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有