所以有一个对象类,一个对象类型,一个对象就是一个类的一个实例。三者有什么区别?
例如(简化):
Class Human { //A class named 'Human'
//some code
}
Human boy = new Human(); // 'boy' is an object, or instance of the Human class.
对象类和对象类型在哪里合适?“对象”一词似乎含糊不清,因为它具有 3 个含义/用途。
首先,object
和System.Object
是同义词。这只是编写相同类型名称的两种方法。这里没有两个概念。
至于你的问题是说它object
是一种类型并且说一个对象是一种类型的实例是否不一致:
假设我告诉你那fish
是一种动物。然后假设我递给你一条(活)鲑鱼并说“那是一条鱼”。你会说我以两种不一致的方式使用“鱼”吗?首先我说这fish
是分类方案的一部分,然后我说不,“鱼”是一种真正的活体动物。你会觉得这很混乱吗?是模棱两可的吗?我们是否应该有两个词,一个用于分类方案,一个用于特定实例?
我想你可能不难处理这种歧义。fish
根据句子的上下文,您可以确定是否引用了特定的鱼或一般类别。事实上,一个类别的名称和该类别的一个实例的名称可能看起来很自然。newspapers
如果我们用一个词来表示一般类别,而另一个词完全用于特定报纸,等等,这似乎很奇怪。
对象,同样的事情。正如“鱼”既用于表示类别又表示该类别的成员一样, “对象”也是如此。
如果有帮助,当您将对象称为实例时,请说“对象”,而当您提及类型时,请说object
. 我就是做这个的。
System.Object
是一个类,它object
是一个别名。两者都是类型(每个类都是一个类型,但不是每个类型都是一个类)。
术语“对象”通常也指一种类型的实例。因此只有两个不同的(尽管相关的含义:.NET 类型系统中特定名称的类型名称,以及表示该类型系统中类型实例的通用术语)。
现在它变得令人困惑:
object o;
这o
是一个类型的对象object
。天啊!
首先,有System.Object
哪个是 .NET 中所有类的基类。
其次,一个对象是一个类的实例,这意味着你有一个类,描述实例的行为(它们的方法)和它们的数据(给它们一个标识并将它们与其他实例区分开来)。
// 'boy' is an object, or instance of the Human class.
两个都!根据文档。
这是 .NET Framework 中所有类的终极基类;它是类型层次结构的根。
因此,所有类型的所有实例都是 .NET 中的对象。
此外,object
只是一个别名System.Object
。两者是同义词。
“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();
}
这给了你输出 -
这为您提供了一个不共享类型的对象数组(除了对象)!绝对不是他们在学校教你的。另外,永远不要这样做。
class
定义实例,并且通常被称为 (with structs
) as Types
。这些充当这些实例的行为模板。AType
可以从另一个“继承”行为Type
,这就是继承的原则。例如(也许是不好的例子), aBoy
是 的子类型。Human
Type
它们定义,并且(通常)使用new
运算符创建Type
也是 的实例System.Object
,它有一个简写表示object
.net 中有一个Object 类,它恰好是一个名为 Object 的类。这是所有类派生的基类。这意味着定义的任何新类都可以访问 Object 类的所有成员(包括示例中的 Human 类)。
您说对象是类的实例是正确的。听起来可能很奇怪,但可以有一个Object
类对象。示例:
Object o = new Object();
^object
^class/type
命名有点混乱,但希望这是有道理的。
我一直认为类型是可以描述类或原语的术语。所以int
或Object
可能是类型,但不是o
来自我的示例。
类是定义对象的代码块:
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 中 Object 的别名。在 C# 的统一类型系统中,所有类型,预定义的和用户定义的,引用类型和值类型,都直接或间接地继承自 Object。您可以将任何类型的值分配给对象类型的变量。
对象:一个对象由实例成员组成,其值使其在一组相似的对象中是唯一的。C# 代码中使用的所有对象都是对象类型。当一个对象被实例化时,它会被分配一块内存并根据对象底层类提供的蓝图进行配置。
主要来自msdn。你应该检查一下:http: //msdn.microsoft.com/en-us/library/67ef8sbd.aspx
希望能帮助到你。
将每个类类型的存储位置(类型的变量object
或任何其他类类型都符合此条件)视为保存“对象 ID”而不是保存对象可能会有所帮助[术语“引用”具有多种含义; 术语“对象 ID”将避免这种歧义]。因为对于对象 ID 并不能做很多事情,但是对于 ID 所引用的对象可能需要做很多事情,在许多 .net 语言中,将.
运算符应用于对象 ID 将访问成员由该 ID 引用的对象。
请注意,对象 ID 没有文本表示,但从概念上讲,为它们分配任意数字可能很有用。假设Car
是一个类类型,并且FordFocus
是一个派生自它的类类型。一份声明
Car Fred = new FordFocus();
将选择一个未使用的对象 ID(假设它选择 #42),使用该 ID 生成 FordFocus 类的新实例,并将该 ID 存储在Fred
. 请注意,Fred
不能也不拥有 的实例FordFocus
,也不拥有 的实例Car
。相反,它可以保存的只是一个对象 ID,如果它标识任何内容,则可以保证标识其中一个实例Car
或从其派生的类;在这种特殊情况下,它拥有#42。如果代码然后说:
Object Barney = Fred;
代码将检查任何可能存储在 Fred 中的对象 ID 是否可以安全地存储在 Barney 中,确定它可以,然后继续将 Barney 设置为 #42。
如果代码然后说
Fred.Color = Blue;
代码实际上不会影响Fred
(它在语句之前保留“#42”,并将继续保留“#42”),但它会影响对象#42——把它变成一辆蓝色的汽车。
那时,如果代码说:
Fred = new HyundaiSonata();
系统将生成一个新 ID(例如 #57),使用该 ID 创建一个 HyundaiSonata 实例,并将 #57 存储到 Fred 中。该语句将覆盖 Fred 中的值(它曾经包含 #42,但现在它包含 #57),但它不会影响 Object #42(它仍然是蓝色的 FordFocus)。