如果我们有一个类,比如MyClass
,当实例化该类的对象时,这两者之间的区别是什么:
Object obj=new MyClass();
MyClass obj2=new MyClass();
我知道。NET中,所有类都派生自System.Object
,因此在这种情况下,obj和obj2变量只包含对对象的引用。
但是,有什么不同吗
如果是,当使用这两种实例化对象的方法时,它是什么
假设你的类有一个名为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)执行自动转换。