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
    操作符创建的
  • 任何
    类型
    的所有实例也都是
    系统对象
    的实例,该对象具有速记表示法
    对象
在.net中有一个类,该类恰好具有名称对象。这是所有类派生的基类。这意味着定义的任何新类都可以访问对象类的所有成员(包括示例中的Human类)

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

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