0

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

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

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

然而,有什么不同吗?

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

4

5 回答 5

3

假设您的班级有一个名为 的属性Name,如果您使用它,

Object obj = new MyClass();

并尝试使用:

obj.Name = "George";

这将是编译器错误,因为 Object 类没有Name属性。但是,这会很好:

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

因为它obj2是一个MyClass. 简而言之,为了访问变量的类成员(属性、方法、变量),该变量必须是具有这些成员的类型,或者需要强制转换为必要的类:

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

但是,不断地转换变量以获取其成员并不好,因为它需要额外的 CPU 周期并且可能导致 InvalidCastExceptions。

于 2013-02-05T04:23:32.237 回答
1

好吧,这有点简单,当然你可以将你的类实例化为一个对象,但是为什么呢?如果你想使用它的任何东西,你必须将它作为你的类。

使用示例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

所以除非你的类中没有任何东西创建为对象是好的,但是为什么要使用一个类只是使用对象。

于 2013-02-05T04:26:23.283 回答
0
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。但是,在编译时它仍然是一个对象,您需要显式转换才能访问 obj 中 Myclass 的属性。

于 2013-02-05T04:25:14.767 回答
0

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

obj.MyClassMethod()

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

于 2013-02-05T04:25:59.773 回答
0

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

于 2013-02-05T04:27:27.660 回答