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

时间:2013-02-05 04:16:04

标签: c# types reference covariance

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

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

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

但是,有什么不同吗?

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

5 个答案:

答案 0 :(得分:3)

假设您的类有一个名为Name的属性,如果您使用了该属性,

Object obj = new MyClass();

并尝试使用:

obj.Name = "George";

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

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

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

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

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

答案 1 :(得分: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

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

答案 2 :(得分: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。但是,在编译时它仍然是一个Object,你需要显式转换才能访问obj中Myclass的属性。

答案 3 :(得分:0)

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

obj.MyClassMethod()

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

答案 4 :(得分:0)

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