CodeQL 文档

使用默认的 ToString()

ID: cs/call-to-object-tostring
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - reliability
   - maintainability
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

调用 System.Object 的(或 System.ValueType 的)ToString 方法将返回该值的类型的完全限定名称。在大多数情况下,这没有用,或者不是预期的结果。此规则查找对默认 ToString 方法的显式和隐式调用。

建议

如果可能,请覆盖默认的 ToString 方法,或执行定制的字符串转换。

示例

在以下示例中,首先对类型为 Person 的对象调用默认的 ToString 方法,然后对整数数组调用该方法。输出结果分别是 p: Bad+Personints: System.Int32[]

using System;

class Bad
{
    static void Main(string[] args)
    {
        var p = new Person("Eric Arthur Blair");
        Console.WriteLine("p: " + p);

        var ints = new int[] { 1, 2, 3 };
        Console.WriteLine("ints: " + ints);
    }

    class Person
    {
        private string Name;

        public Person(string name)
        {
            this.Name = name;
        }
    }
}

在修复后的示例中,在 Person 类中覆盖了 ToString 方法,并使用 string.Join 打印整数数组的元素(在这种情况下无法覆盖 ToString)。输出结果分别是 p: Eric Arthur Blairints: 1, 2, 3

using System;

class Good
{
    static void Main(string[] args)
    {
        var p = new Person("Eric Arthur Blair");
        Console.WriteLine("p: " + p);

        var ints = new int[] { 1, 2, 3 };
        Console.WriteLine("ints: " + string.Join(", ", ints));
    }

    class Person
    {
        private string Name;

        public Person(string name)
        {
            this.Name = name;
        }

        public override string ToString() => Name;
    }
}

参考资料

  • ©GitHub 公司
  • 条款
  • 隐私