如果我們有一類,說MyClass
,實例化類的一個對象時,就是這兩者之間的區別:通過指定確切的類和System.Object來引用對象有什麼區別?
Object obj=new MyClass();
MyClass obj2=new MyClass();
我知道,在.NET中,所有的類都是從System.Object
派生,所以在這種情況下,obj和obj2變量只包含對象的引用。
但是,有什麼區別嗎?
如果是這樣,當使用這兩種實例化對象的方法時,它是什麼?
如果我們有一類,說MyClass
,實例化類的一個對象時,就是這兩者之間的區別:通過指定確切的類和System.Object來引用對象有什麼區別?
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";
因爲obj2
是MyClass
。總之,爲了訪問一個變量的類成員(屬性,方法,變量),該變量必須是具有這些成員的類型,或者它需要被轉換爲必要的類:
((MyClass)obj).Name = "George";
然而,爲了獲得它們的成員而不斷地轉換變量並不好,因爲它需要額外的CPU週期並且可能導致InvalidCastExceptions。
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的屬性。
假設MyClass
直接從Object
繼承,寫Object obj = new MyClass()
創建MyClass
對象,但對它的引用是Object
類型。因此,不知道存在於類MyClass
任何公開可用的方法,屬性或狀態變量,因此,如果您嘗試撥打:
obj.MyClassMethod()
通話將失敗。 obj
的唯一可用方法將是由Object
類公開的那些方法,除非使用某種形式的鑄造。
那麼ita有點毫不起眼,當然你可以將你的課程作爲一個對象進行instaniate,但爲什麼?如果你想使用任何東西,你將不得不把它當作你的課程。使用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
所以,除非在沒有在你的類創建那裏對象是好的,但後來爲什麼要使用一個類只使用對象
例。
第一:術語。你只是以一種方式實例化MyClass的實例:通過調用它的構造函數。你在做什麼是以兩種方式引用實例。這是因爲多態性,類實例可以通過它實現的任何類型引用的屬性。在寫入實例時,不同的方法之間沒有很大的區別,但是當您想要使用某些基本類型執行某些操作時,可能會存在很大的區別。 CLR從子類型(MyClass)及其基類型(Object)執行自動轉換。
嘗試在'obj'變量上調用MyClass方法,您很快就會看到差異。 –
這意味着變量的靜態類型(在編譯時)是Object而不是MyClass,動態類型(在運行時)是MyClass,所以你只能調用在'對象'類(除非你*投*)。 –