我应该覆盖字符串强制转换或ToString方法吗?

por*_*837 1 c# string casting tostring

如果我创建一个从根本上包含字符串消息的类,但也包含与字符串消息关联的有用数据,我是否有任何理由应该重写ToString()方法而不是定义强制转换为字符串以获取对象的内部字符串信息?

例如,我有一个名为msg的Message对象,text == "Hello"但它也包含有关文本来源的信息.我想Console.WriteLine(msg);输出"Hello".我应该覆盖ToString()或定义一个转换为字符串?

awe*_*oon 6

您应该覆盖该ToString方法.

首先:Console.WriteLine接受object并调用ToString它的方法.

其次:在将来的某个时候,您可能需要创建类,派生自Message.我们来看看这个:

using System;
using System.IO;

namespace Namespace
{
    class StringCastBase
    {
        public static explicit operator string(StringCastBase o)
        {
            return "string cast base";
        }
    }

    class StringCastDerived : StringCastBase
    {
        public static explicit operator string(StringCastDerived o)
        {
            return "string cast derived";
        }
    }

    class ToStringOverridenBase
    {
        public override string ToString()
        {
            return "ToString overriden base";
        }
    }

    class ToStringOverridenDerived : ToStringOverridenBase
    {
        public override string ToString()
        {
            return "ToString overriden derived";
        }
    }

    class Programm
    {
        public static void Main()
        {
            StringCastBase scb = new StringCastBase();
            Console.WriteLine((string)scb);

            StringCastBase scd = new StringCastDerived();
            Console.WriteLine((string)scd);

            ToStringOverridenBase tsob = new ToStringOverridenBase();
            Console.WriteLine(tsob);

            ToStringOverridenBase tsod = new ToStringOverridenDerived();
            Console.WriteLine(tsod);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出将是

串铸基地

串铸基地

ToString覆盖基础

ToString覆盖派生

由于静态类型scdStringCastBase,StringCastBase将调用转换方法(即使动态类型不是StringCastBase).使用方法ToString解决了这个问题.