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

时间:2009-07-23 09:58:44

标签: c# string casting parsing

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

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

另一个是:

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

我感兴趣的是两者有什么区别?第一个更有效率吗? (这只是一个推测,在我的脑海中ToString()方法是通过一些循环机制实现的,只是把它“加速”可能会更快,但这只是我的“直觉”。

还有更快/更优雅的方式吗?

任何人都可以为我解决这个问题吗?

9 个答案:

答案 0 :(得分:50)

  

这两个是针对不同的   目的。任何ToString方法   object应该返回一个字符串   该对象的表示。铸件   是非常不同的,'as'键   单词执行条件转换,如   有人说过。 'as'关键词   基本上说“给我一个参考   这种类型的那个类型   对象就是这种类型“而ToString   说“给我一个字符串代表   该对象的结果“。结果可能是   在某些情况下相同,但两者应该   永远不会被认为可以互换   因为,正如我所说,他们存在   不同的目的。如果你的意图   是施放然后你应该总是使用   演员,不是ToString。

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

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

答案 1 :(得分:30)

如果您知道它是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()更快。

答案 2 :(得分:16)

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

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

public override string ToString()
{
    return this;
}

答案 3 :(得分:5)

由于CLR必须执行各种运行时类型检查,因此向下转换是一个相对较慢的操作。但是,在此特定情况下,为了保持一致性,转换为string比调用ToString()更合适(您无法在ToInt32上调用object,而是将其转换为int {{1}})和maintanability。

答案 4 :(得分:4)

我想再发表一条评论

如果你打算使用cast:string name =(string)DataRowObject [“name”] 你将得到一个异常:如果数据库表中的记录具有空值,则无法将'System.DBNull'类型的对象强制转换为类型'System.String'。

在这种情况下,您必须使用:string name = DataRowObject [“name”]。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";

}

答案 5 :(得分:3)

对于数据对象,我建议您使用“as”关键字,如下面的代码。

string name = DataRowObject["name"] as string;

请在使用价值前检查。

if(name != null)
{
    // statement for empty string or it has value
}
else
{
    // statement for no data in this object.    
}

答案 6 :(得分:2)

在这种情况下:

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

因为它是string,我认为字符串对象的ToString()方法很简单:

return this;

所以恕我直言,没有性能损失。

PS 我是一名Java程序员,所以这只是一个猜测。

答案 7 :(得分:1)

默认情况下,ToString()不执行强制转换。其目的是返回表示类型的字符串(例如“System.Object”)。

如果你想避免强制转换,你可以尝试考虑强类型的实现(例如使用泛型)并完全避免使用DataRowObject。

答案 8 :(得分:1)

我知道你提到Object是一个字符串,但是你担心返回的对象为null,你也可以使用“Convert.ToString(DataRowObject [”name“]);”如果对象为null,则返回空字符串(string.empty)有额外的好处,以避免任何空引用异常(除非你想要在这种情况下抛出异常)。