C# 关于“如何”的困惑;“对象”;在C中使用#
所以有一个对象类,一个对象类型,一个对象是一个类的实例。三者之间的区别是什么 例如(简化):C# 关于“如何”的困惑;“对象”;在C中使用#,c#,object,C#,Object,所以有一个对象类,一个对象类型,一个对象是一个类的实例。三者之间的区别是什么 例如(简化): 这里的对象类和对象类型在哪里?术语“object”似乎模棱两可,因为它有三种含义/用途。系统。object是一个类,而object是该类的别名。两者都是类型(每个类都是类型,但不是每个类型都是类) 术语“对象”通常也指类型的实例。因此,只有两种不同的含义(尽管是相关的含义:一种是.NET类型系统中特定名称的类型名称,另一种是表示该类型系统中类型实例的通用术语) 现在它变得令人困惑: object o;
这里的对象类和对象类型在哪里?术语“object”似乎模棱两可,因为它有三种含义/用途。
系统。object
是一个类,而object
是该类的别名。两者都是类型(每个类都是类型,但不是每个类型都是类)
术语“对象”通常也指类型的实例。因此,只有两种不同的含义(尽管是相关的含义:一种是.NET类型系统中特定名称的类型名称,另一种是表示该类型系统中类型实例的通用术语)
现在它变得令人困惑:
object o;
这里的
o
是类型为object
的对象。天哪 首先,有一个System.Object
,它是.NET中所有类的基类。其次,对象是类的实例,这意味着您有一个类,描述实例的行为(它们的方法)和数据(给它们一个标识并将它们与其他实例区分开来) 都是!据报道 这是.NET Framework中所有类的最终基类;它是类型层次结构的根 因此,所有类型的所有实例都是.NET中的对象 而且,
object
只是一个别名System.object
。这两个是同义词。“对象”是支持所有其他类的C#类。它允许您访问一组方法,例如GetType、Equals和ToString
基本上,您的人工对象继承自“object”类,并获得对“object”拥有的所有方法的访问权
使用它作为类型(比如int),可以让你做一些漂亮的、不明智的事情。例如,您可以创建以下内容的数组:
static void Main(string[] args)
{
object[] array = new object[4];
array[0] = 1;
array[1] = "1";
array[2] = new object();
array[3] = new StreamWriter(@"C:\file.txt");
foreach (object o in array)
{
if (o != null)
{
Console.WriteLine("Found an object! It's type is: " + o.GetType());
}
else
{
Console.WriteLine("Didn't find an object");
}
}
Console.ReadLine();
}
这将为您提供输出-
这将为您提供一个不共享类型(除对象外)的对象数组!绝对不是他们在学校教你的。而且,永远不要这样做。类定义实例,通常(使用
)称为结构
。它们充当这些实例的行为模板。一个类型
可以从另一个类型
中“继承”行为,这是继承的原则。例如(也许是个坏例子),类型
是男孩
的一个子类型人类
- 实例行为由
类型定义,它们是,并且(通常)是使用
操作符创建的new
- 任何
的所有实例也都是类型
的实例,该对象具有速记表示法系统对象
对象
对象
类对象。例如:
Object o = new Object();
^object
^class/type
命名有点混乱,但希望这是有意义的
我一直认为类型是一个可以描述类或原语的术语。因此,
int
或Object
可以是类型,但在我的示例中不能是o
。首先,Object
和System.Object
是同义词。只有两种方法可以写出相同的类型名。这里没有两个概念
关于你的问题,即说object
是一种类型,而object是一种类型的实例,是否不一致:
假设我告诉你鱼是一种动物。然后假设我递给你一条(活的)鲑鱼,说“那是一条鱼”。你会说我用了两种不一致的方式来使用“鱼”吗?首先我说鱼是分类系统的一部分,然后我说不,“鱼”是一种真正的活动物。你会感到困惑吗?这是不明确的吗?我们是否应该有两个词,一个用于分类方案,一个用于具体实例
我想你在处理这种模棱两可的问题上可能没有困难。根据句子的上下文,您可以确定是指特定的鱼还是指一般类别的fish
。事实上,一个类别的名称和该类别的一个实例的名称是相同的,这似乎很自然。如果我们用一个词来表示一般类别的报纸
,用另一个词来表示特定的报纸,那么这似乎很奇怪,依此类推
对象,同样的事情。正如“鱼”被用来表示一个类别和该类别的一个成员一样,“对象”也是如此
如果有帮助,当您将对象作为实例引用时,请说“object”,当您引用类型时,请说
object
。这就是我要做的。类是定义对象的代码块:
class MyObject
{
//Code that defines what the object is and how it behaves
}
“对象实例”是当您尝试使用在类中定义的对象时得到的结果:
MyObject foo = new MyObject();
“类型”是对正在使用的对象类型的描述。其名称位于上面“类”块的开头
Console.WriteLine(foo.GetType().Name);
上面的行将打印“MyObject”
TL;DR:“类”、“对象”、“类型”在含义上非常接近,以至于在描述代码时它们经常互换。它们都与面向对象编程中对象的定义直接相关。对象类:支持.NET Framework类层次结构中的所有类,并为派生类提供低级服务。这是.NET Framework中所有类的最终基类;它是类型层次结构的根 对象类型:对象类型是.NET Framework中对象的别名。
MyObject foo = new MyObject();
Console.WriteLine(foo.GetType().Name);
Car Fred = new FordFocus();
Object Barney = Fred;
Fred.Color = Blue;
Fred = new HyundaiSonata();