通过指定确切类和 System.Object 来引用对象有什么区别?



如果我们有一个类,比如MyClass,当实例化该类的对象时,这两者之间的区别是什么:

Object obj=new MyClass();
MyClass obj2=new MyClass();

我知道。NET中,所有类都派生自System.Object,因此在这种情况下,objobj2变量只包含对对象的引用。

但是,有什么不同吗

如果是,当使用这两种实例化对象的方法时,它是什么

假设你的类有一个名为Name的属性,如果你使用它,

Object obj = new MyClass();

并尝试使用:

obj.Name = "George";

这将是一个编译器错误,因为Object类没有Name属性。然而,这将是好的:

MyClass obj2 = new MyClass();
obj2.Name = "George";

因为CCD_ 5是CCD_。简而言之,为了访问变量的类成员(属性、方法、变量),该变量必须是具有这些成员的类型,或者需要转换为必要的类:

((MyClass)obj).Name = "George";

然而,为了获取其成员而不断地强制转换变量是不好的,因为这需要额外的CPU周期,并且可能导致InvalidCastException。

这是一个很容易的问题,当然你可以将你的类作为一个对象来实例化,但为什么呢?如果你想使用它的任何东西,你就必须把它当作你的类。

使用DateTime 的示例

object obj = new DateTime();
int test = ((DateTime)obj).Second;   // Have to cast here, as object does not contain Second
DateTime obj2 = new DateTime();
int test2 = obj2.Second; // It is a DateTime so all good
var obj3 = new DateTime(); // Type is infered by right hand side assignment
int test3 = obj3.Second; // It is a DateTime so all good

所以,除非类中没有任何内容,否则创建为对象是可以的,但为什么要使用类,只使用对象呢。

public class MYclass
    {
        public int Id { get; set; }
    }

class Program
{
    static void Main(string[] args)
    {
        Object obj = new MYclass();
        MYclass mc = new MYclass();
        Console.WriteLine(obj.GetType());
        MYclass mc2 = obj as MYclass;
        Console.WriteLine(mc2.Id);
        Console.WriteLine(mc.Id);
        Console.ReadLine();
    }
}

在上面的片段中,输出将是

ConsoleApplication1.MYclass
0
0

这告诉您在运行时obj的类型是Myclass。然而,在编译时,它仍然是一个Object,您需要显式强制转换来访问obj中Myclass的属性。

假设MyClass直接继承自Object,编写Object obj = new MyClass()将创建一个MyClass对象,但对它的引用类型为Object。因此,它不知道类MyClass中存在任何公开可用的方法、属性或状态变量,因此,如果您尝试调用:

obj.MyClassMethod()

呼叫将失败。obj唯一可用的方法将是Object类公开的方法,除非使用某种形式的强制转换。

第一:术语。您只能通过一种方式实例化MyClass的实例:通过调用其构造函数。您正在做的是通过两种方式引用实例。这是因为多态性,即类实例可以被它实现的任何类型引用的属性。在编写实例时,引用实例的不同方式没有太大区别,但当您想使用某个基类型执行某些操作时,可能会有区别。CLR从子类型(MyClass)及其基类型(Object)执行自动转换。

相关内容

  • 没有找到相关文章

最新更新