2

有人可以为我解释一下,这甚至是如何工作的?

ToString()怎么可能在不创建实际方法的情况下从 中返回任何内容?

using System;

namespace ConsoleApplication4
{
    class Person
    {

        private string name;
        private int age;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        **/*  
         * What is ToString() method?
         * What I am overriding Here?
         */**
        public override string ToString()
        {
            return "Name= " + Name + " Age=" + Age;
        }        
    }
    class Sample
    {
        static void Main(string[] args)
        {
            Person P1 = new Person();
            P1.Name = "ABC";
            P1.Age = 21;
            Console.WriteLine(P1.ToString());
            Console.ReadLine();

            **//Ouput Name = ABC Age = 23**
        }
    }
}
4

3 回答 3

11

C# 中的所有类和结构都隐式派生自System.Object. 你是压倒一切的Object.ToString

在 C# 中,当您编写时:

class Person
{

它实际上与写作相同

class Person : System.Object
{

怎么可能在不创建实际方法的情况下从 ToString() 返回任何内容?

如果您不覆盖ToString,您将获得由System.Object.ToString().

隐式基类System.Object记录在 C# 语言规范的 4.2.2 中:

对象类类型是所有其他类型的最终基类。C# 中的每种类型都直接或间接地派生自对象类类型。

关键字 object 只是预定义类 System.Object 的别名。

请注意,它与 custom 略有不同struct,因为值类型派生自System.ValueType,但System.Object仍然是继承层次结构的一部分。

这记录在 C# 语言规范的 4.1.1 中:

所有值类型都隐式继承自 System.ValueType 类,而后者又继承自类对象。任何类型都不可能从值类型派生,因此值类型是隐式密封的(第 10.1.1.2 节)。

请注意,System.ValueType 本身不是值类型。相反,它是自动派生所有值类型的类类型。

于 2013-08-07T16:15:58.493 回答
4

怎么可能在不创建实际方法的情况下从 ToString() 返回任何内容

的默认实现Object.ToString()很简单:

return GetType().ToString();

这将返回类型的(非限定)名称。如果你没有在你的Person类上覆盖它,那么它就会返回"Person"

子类可以自由地重写此方法以返回更有用的字符串,其中可能包括对象的一些状态,甚至是对象的人类友好表示。(DateTime例如,这样做。)

于 2013-08-07T16:16:32.337 回答
1

public override string正在创建一个方法,它恰好已经存在,因此 override 关键字用于表示您正在重新定义父类(System.Object)中的方法。

更多信息在这里:http: //msdn.microsoft.com/en-us/library/system.object.aspx

因为 .NET Framework 中的所有类都派生自 Object,所以 Object 类中定义的每个方法在系统中的所有对象中都可用。派生类可以并且确实会覆盖其中一些方法,包括:

  • Equals - 支持对象之间的比较。

  • Finalize - 在自动回收对象之前执行清理操作。

  • GetHashCode - 生成一个对应于对象值的数字,以支持使用哈希表。

  • ToString - 制造一个人类可读的文本字符串,描述类的一个实例。
于 2013-08-07T16:17:05.953 回答