2

所以有一个对象类,一个对象类型,一个对象就是一个类的一个实例。三者有什么区别?

例如(简化):

Class Human {              //A class named 'Human'
//some code
}

Human boy = new Human();   // 'boy' is an object, or instance of the Human class.

对象类和对象类型在哪里合适?“对象”一词似乎含糊不清,因为它具有 3 个含义/用途。

4

10 回答 10

13

首先,objectSystem.Object是同义词。这只是编写相同类型名称的两种方法。这里没有两个概念。

至于你的问题是说它object是一种类型并且说一个对象是一种类型的实例是否不一致:

假设我告诉你那fish是一种动物。然后假设我递给你一条(活)鲑鱼并说“那是一条鱼”。你会说我以两种不一致的方式使用“鱼”吗?首先我说这fish分类方案的一部分,然后我说不,“鱼”是一种真正的活体动物。你会觉得这很混乱吗?是模棱两可的吗?我们是否应该有两个词,一个用于分类方案,一个用于特定实例

我想你可能不难处理这种歧义。fish根据句子的上下文,您可以确定是否引用了特定的鱼或一般类别。事实上,一个类别的名称和该类别的一个实例的名称可能看起来很自然。newspapers如果我们用一个词来表示一般类别,而另一个词完全用于特定报纸,等等,这似乎很奇怪。

对象,同样的事情。正如“鱼”既用于表示类别又表示该类别的成员一样, “对象”也是如此。

如果有帮助,当您将对象称为实例时,请说“对象”,而当您提及类型时,请说object. 我就是做这个的。

于 2013-03-19T20:34:17.803 回答
3

System.Object是一个类,它object是一个别名。两者都是类型(每个类都是一个类型,但不是每个类型都是一个类)。

术语“对象”通常也指一种类型的实例。因此只有两个不同的(尽管相关的含义:.NET 类型系统中特定名称的类型名称,以及表示该类型系统中类型实例的通用术语)。

现在它变得令人困惑:

object o;

o是一个类型的对象object。天啊!

于 2013-03-19T20:29:15.957 回答
0

首先,有System.Object哪个是 .NET 中所有类的基类。
其次,一个对象是一个类的实例,这意味着你有一个类,描述实例的行为(它们的方法)和它们的数据(给它们一个标识并将它们与其他实例区分开来)。

于 2013-03-19T20:29:33.363 回答
0
// 'boy' is an object, or instance of the Human class.

两个都!根据文档

这是 .NET Framework 中所有类的终极基类;它是类型层次结构的根。

因此,所有类型的所有实例都是 .NET 中的对象。

此外,object只是一个别名System.Object。两者是同义词。

于 2013-03-19T20:29:41.963 回答
0

“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();
    }

这给了你输出 -

在此处输入图像描述

这为您提供了一个不共享类型的对象数组(除了对象)!绝对不是他们在学校教你的。另外,永远不要这样做。

于 2013-03-19T20:30:03.483 回答
0
  • Aclass 定义实例,并且通常被称为 (with structs) as Types。这些充当这些实例的行为模板。AType可以从另一个“继承”行为Type,这就是继承的原则。例如(也许是不好的例子), aBoy是 的子类型Human
  • 实例行为由Type它们定义,并且(通常)使用new运算符创建
  • any 的所有实例Type也是 的实例System.Object,它有一个简写表示object
于 2013-03-19T20:30:40.920 回答
0

.net 中有一个Object 类,它恰好是一个名为 Object 的类。这是所有类派生的基类。这意味着定义的任何新类都可以访问 Object 类的所有成员(包括示例中的 Human 类)。

您说对象是类的实例是正确的。听起来可能很奇怪,但可以有一个Object类对象。示例:

Object o = new Object();
       ^object
^class/type

命名有点混乱,但希望这是有道理的。

我一直认为类型是可以描述类或原语的术语。所以intObject可能是类型,但不是o来自我的示例。

于 2013-03-19T20:30:57.210 回答
0

类是定义对象的代码块:

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:“类”、“对象”、“类型”在含义上都非常接近,以至于在描述代码时它们经常互换。它们中的每一个都直接与面向对象编程中的对象定义相关。

于 2013-03-19T20:37:40.287 回答
0

对象类:支持 .NET Framework 类层次结构中的所有类,并为派生类提供低级服务。这是 .NET Framework 中所有类的终极基类;它是类型层次结构的根。

对象类型:对象类型是 .NET Framework 中 Object 的别名。在 C# 的统一类型系统中,所有类型,预定义的和用户定义的,引用类型和值类型,都直接或间接地继承自 Object。您可以将任何类型的值分配给对象类型的变量。

对象:一个对象由实例成员组成,其值使其在一组相似的对象中是唯一的。C# 代码中使用的所有对象都是对象类型。当一个对象被实例化时,它会被分配一块内存并根据对象底层类提供的蓝图进行配置。

主要来自msdn。你应该检查一下:http: //msdn.microsoft.com/en-us/library/67ef8sbd.aspx

希望能帮助到你。

于 2013-03-19T20:44:09.033 回答
0

将每个类类型的存储位置(类型的变量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)。

于 2013-03-19T21:54:10.450 回答