请查看以下示例:
using System;
class MyClass
{
static int count = 0;
int id;
public MyClass()
{
id = count;
count++;
}
public override string ToString()
{
return "MyClass object #" + id;
}
}
class Test
{
static void Main()
{
MyClass ob1 = new MyClass();
MyClass ob2 = new MyClass();
MyClass ob3 = new MyClass();
Console.WriteLine(ob1);
Console.WriteLine(ob2);
Console.WriteLine(ob3);
}
}
程序的输出如下所示:
MyClass对象#0
MyClass对象#1
MyClass对象#2
正如您在此处所见,方法ToString()在名为“MyClass”的类中被覆盖,但“MyClass”不是从任何类派生的,根本不存在继承。如果没有涉及继承如何使用'覆盖'?
如果我们将ToString()更改为任何其他方法名称说'HelloString()',如下面的代码片段所示:
public class Program
{
public static void Main(string[] args)
{
MyClass ob1 = new MyClass();
MyClass ob2 = new MyClass();
MyClass ob3 = new MyClass();
Console.WriteLine(ob1);
Console.WriteLine(ob2);
Console.WriteLine(ob3);
}
}
class MyClass
{
static int count = 0;
int id;
public MyClass()
{
id = count;
count++;
}
public override string HelloString()
{
return "MyClass object #" + id;
}
}
编译器抛出错误:'找不到合适的方法来覆盖'
为什么使用'ToString()'方法的这种特殊行为?
答案 0 :(得分:6)
取自https://msdn.microsoft.com/en-us/library/system.object(v=vs.110).aspx。
Object类是.NET Framework中所有类的最终基类;它是类型层次结构的根。
语言通常不需要类来声明继承 对象,因为继承是隐式的。
因为.NET Framework中的所有类都是从Object派生的,所以Object类中定义的每个方法都可以在系统中的所有对象中使用。派生类可以并且确实覆盖其中一些方法,包括:
- 等于 - 支持对象之间的比较。
- Finalize - 在对象之前执行清理操作 自动回收。
- GetHashCode - 生成一个对应于该值的数字 对象支持使用哈希表。
- ToString - 制作描述的人类可读文本字符串 一个类的实例。
答案 1 :(得分:0)
它派生自Object,这是定义该方法的地方。
答案 2 :(得分:0)
每个类型都是从oop中的对象派生出来的,那里定义了ToString()方法,而虚拟的则可以覆盖它
答案 3 :(得分:0)
Object
有ToString()
方法。每个类都继承自Object
。
答案 4 :(得分:0)
继承了ToString
方法 !
所有类都隐式继承了一件事。而结构类也继承了它。通过装箱,您可以为该类型的变量分配结构。
你能猜出它是什么吗?
这是
Object
!
此类包含ToString
,GetHashCode
,Equals
等方法,您可以覆盖这些方法来定义您自己的对象行为。你可以在这里看到更多:
https://msdn.microsoft.com/en-us/library/system.object(v=vs.110).aspx
答案 5 :(得分:0)
真的,你的MyClass派生自Object类。如果你使用
class MyClass : Object
结果是一样的。