C# C中字典的错误输出#

C# C中字典的错误输出#,c#,dictionary,C#,Dictionary,为什么从字典打印时会得到namespace.object的输出 这是我的数据对象 namespace MoleCalculator { public class elementDO { public int AtomicNumber { get; set; } public string Symbol { get; set; } public string Name { get; set; } public deci

为什么从字典打印时会得到namespace.object的输出

这是我的数据对象

namespace MoleCalculator
{
    public class elementDO
    {
        public int AtomicNumber { get; set; }
        public string Symbol { get; set; }
        public string Name { get; set; }
        public decimal AtomicWeight { get; set; }
    }
}
这是有我字典的班级

namespace MoleCalculator
{
public class elementDictionary
{
    public Dictionary<int, elementDO> periodic_Table = new Dictionary<int, elementDO>()
    {
        {1,new elementDO{AtomicNumber = 1,Symbol = "H",Name = "Hydrogen", AtomicWeight = 1.007825M}},
您需要重写,因为默认实现只返回名称空间和类名。我在这里为您提供了一个如何覆盖
ToString
的示例:

public class elementDO
{
    public int AtomicNumber { get; set; }
    public string Symbol { get; set; }
    public string Name { get; set; }
    public decimal AtomicWeight { get; set; }

    public override string ToString()
    {
        return $"AtomicNumber: {AtomicNumber}. Symbol: {Symbol}. Name: {Name}. AtomicWeight: {AtomicNumber}";
    }
}
您的代码与上面提到的
ToString
实现一起将给出以下输出:


AtomicNumber:1。符号:H。名称:氢。AtomicWeight:1

正如注释所建议的,在创建自定义类时,应该重写默认方法


首先,不管是谁否决了这个问题,都应该被枪毙。这是一个奇妙的问题

答案在于您从Console.WriteLine()语句中所暗示的内容。此方法接受一个字符串。该方法从元素[1]推断为“元素[1].ToString()”的意思。因为您没有重写object.ToString()方法,所以默认输出是您得到的—一个毫无意义的名称空间和对象名

这个问题有两个答案。正如建议的那样,您可以在对象中提供一个覆盖,为其提供一个默认输出。另一个选项是更具体地说明发送到Console.WriteLine()的内容,例如:

Console.WriteLine(string.Format("{0} ({1}), elements[1].Name, elements[1].Symbol));
控制台输出如下所示:

氢(H)


您必须重写
ToString
。对象的默认字符串表示形式是该对象的类型名称。NET无法知道您个人认为您的对象应该如何打印。您必须通过覆盖该对象上的
.ToString()
来说明这一点。谢谢,我以前不清楚这一点,而且我在找到解决方案时遇到了很多困难。感谢您提供有关.NET命名的提示,我正在尝试完善我的实践。然后我建议您看一看:Upvote,这是一个替代解决方案的好例子!也谢谢,我很高兴知道所有可能的方法!。正如您所知,Console.WriteLine有一个字符串格式重载。
// I would change the class name to ElementDO in order to be consist with .NET Naming Conventions
public class elementDO
{
    public int AtomicNumber { get; set; }
    public string Symbol { get; set; }
    public string Name { get; set; }
    public decimal AtomicWeight { get; set; }

    public override string ToString()
    {
        return string.Format("{0}:{1}:{2}:{3}", AtomicNumber, Symbol, AtomicWeight, Name);
    }
}
Console.WriteLine(string.Format("{0} ({1}), elements[1].Name, elements[1].Symbol));