我已经读过ToString()使用反射(虽然它应该只是在它被调用的对象周围放置引号,所以我不知道它可以使用反射的位置/原因)。这有什么证据吗?调用.ToString()(也许我应该调用Convert.ToString()?)会不会有任何性能损失?
答案 0 :(得分:4)
如果您没有覆盖ToString()
方法,则最终会调用Object.ToString()
,其实现如下所示:
public virtual string ToString()
{
return this.GetType().ToString();
}
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
public extern Type GetType();
该方法不仅仅是“在被调用的对象周围加上引号”。为了实现这个结果,它必须反射性地获取运行时类型信息并在其上调用ToString()
,这反过来看起来像这样:
public override string ToString()
{
return ("Type: " + this.Name);
}
任何时候你通过反射来获得一些性能损失,但在这种情况下可能不是一个足够重要的东西 - 除非你是在一个非常紧凑的非常大的循环中进行的。
您是否看到了性能问题?您想要实现的目标是让您想要调用Object.ToString()
而不是调用您提供的被覆盖版本?
答案 1 :(得分:3)
我认为如果你不重写ToString(),那就是它最终使用反射。
如果你有:
public class SomeObject
{
public void SomeMethod();
}
void program
{
SomeObject o = new SomeObject();
Console.WriteLine(o.ToString());
}
您必须使用反射来了解对象的类型。 现在,如果你重写ToString(),你应该做一个有意义的字符串表示,那么你编写的代码将被直接调用没有反射。