有人可以帮我解释一下,这是怎么回事?
如果不创建实际方法,如何从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**
}
}
}
答案 0 :(得分: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#中的每个类型都直接或间接地从对象类类型派生。
关键字对象只是预定义类System.Object的别名。
请注意,它与自定义struct
略有不同,因为值类型派生自System.ValueType
,但System.Object
仍然是继承层次结构的一部分。
这在C#语言规范的4.1.1中有记载:
所有值类型都隐式继承自System.ValueType类,而System.ValueType又继承自类对象。任何类型都不可能从值类型派生,因此值类型被隐式密封(第10.1.1.2节)。
请注意,System.ValueType本身不是值类型。相反,它是一个类类型,从中可以自动派生所有值类型。
答案 1 :(得分:4)
如何在不创建实际方法的情况下,甚至可以从ToString()返回任何内容
Object.ToString()
的默认实现只是:
return GetType().ToString();
这将返回该类型的(非限定)名称。如果您没有在Person
课程上覆盖它,那么它将返回"Person"
。
子类可以自由地重写此方法以返回更有用的字符串,该字符串可能包含某些对象的状态,甚至是对象的人性化表示。 (DateTime
例如这样做。)
答案 2 :(得分:1)
public override string
正在创建一个方法,它恰好已经存在,因此override关键字用于表示您正在重新定义父类(System.Object)中的方法。
此处有更多信息:http://msdn.microsoft.com/en-us/library/system.object.aspx
因为.NET Framework中的所有类都派生自Object, Object类中定义的每个方法都可用于所有对象 在系统中。派生类可以并且确实覆盖其中的一些 方法,包括:
等于 - 支持对象之间的比较。
Finalize - 在自动回收对象之前执行清理操作。
GetHashCode - 生成与对象值对应的数字,以支持使用哈希表。
- ToString - 制作描述该类实例的人类可读文本字符串。