当对象实际上是一个字符串时,转换对象为字符串

这其实不是什么问题,不过我很好奇。当我将一个字符串保存到 let say an DataRow 中时,它被强制转换为 Object。当我想要使用它时,我必须对它进行 ToString 强制转换。据我所知,有几种方法可以做到这一点,第一种是

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

另一个是:

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

我感兴趣的是两者之间的区别是什么?第一个更有效吗?(这只是一种推测,在我的头脑中,ToString ()方法是通过某种循环机制实现的,其中只是强制转换它“可能”会更快,但这只是我的“直觉”)。

有没有更快更优雅的方法呢?

有人能帮我澄清一下吗?

101656 次浏览

如果你知道它是一个 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()

基本上在您的情况下,最好保持类型强制转换,因为。ToString ()可能隐藏 bug。例如,数据库架构已更改,名称不再是字符串类型,而是使用。ToString ()代码仍然可以工作。所以在这种情况下,最好使用类型强制转换。

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

public override string ToString()
{
return this;
}

向下转换是一个相对较慢的操作,因为 CLR 必须执行各种运行时类型检查。然而,在这个特定的场景中,为了保持一致性(您不能在 object上调用 ToInt32,但是将其转换为 int)和可维护性,将其转换为 string比调用 ToString()更合适。

两者的目的不同 的 ToString 方法 对象应该返回一个字符串 表现那个物体。铸造 是非常不同的,和’为’键 单词执行条件转换,如 已经说过了,关键词是“ as” 基本上就是说“给我一份 这个类型到那个对象,如果 对象是这种类型”,而 ToString 说“给我一个字符串表示” 结果可能是 在某些情况下是一样的,但两者应该 永远不能被认为是可以互换的 因为,就像我说的,他们存在的意义 不同的目的。如果你的意图 那么你应该一直使用 一个铸件,不是 ToString。

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

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

在这种情况下:

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

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

return this;

所以恕我直言,没有绩效处罚。

附言 我是一个 Java 程序员,所以这个答案只是一个猜测。

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

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

对于数据对象,我建议您使用“ 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.
}

我想再说一句

如果要使用强制转换: string name = (string) DataRowObject [“ name”] 您将得到一个 Exception: 无法将类型为“ System.DBNull”的对象强制转换为类型为“ System”。如果数据库表中的记录具有空值,则使用字符串’。

在这个场景中,必须使用: 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";


}

我知道你提到过 Object 是一个字符串,但是如果你担心返回的对象是 null,你也可以使用“ Convert.ToString (DataRowObject [“ name”])进行强制转换;”如果对象是 null,那么还有一个额外的好处,那就是返回一个空字符串(string.void) ,以避免任何 null 引用异常(当然,除非你想在这种情况下抛出异常)。