2013-02-05 34 views
0

如果我們有一類,說MyClass,實例化類的一個對象時,就是這兩者之間的區別:通過指定確切的類和System.Object來引用對象有什麼區別?

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

我知道,在.NET中,所有的類都是從System.Object派生,所以在這種情況下,objobj2變量只包含對象的引用。

但是,有什麼區別嗎?

如果是這樣,當使用這兩種實例化對象的方法時,它是什麼?

+6

嘗試在'obj'變量上調用MyClass方法,您很快就會看到差異。 –

+0

這意味着變量的靜態類型(在編譯時)是Object而不是MyClass,動態類型(在運行時)是MyClass,所以你只能調用在'對象'類(除非你*投*)。 –

回答

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。

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的屬性。

0

假設MyClass直接從Object繼承,寫Object obj = new MyClass()創建MyClass對象,但對它的引用是Object類型。因此,不知道存在於類MyClass任何公開可用的方法,屬性或狀態變量,因此,如果您嘗試撥打:

obj.MyClassMethod()

通話將失敗。 obj的唯一可用方法將是由Object類公開的那些方法,除非使用某種形式的鑄造。

1

那麼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 

所以,除非在沒有在你的類創建那裏對象是好的,但後來爲什麼要使用一個類只使用對象

例。

0

第一:術語。你只是以一種方式實例化MyClass的實例:通過調用它的構造函數。你在做什麼是以兩種方式引用實例。這是因爲多態性,類實例可以通過它實現的任何類型引用的屬性。在寫入實例時,不同的方法之間沒有很大的區別,但是當您想要使用某些基本類型執行某些操作時,可能會存在很大的區別。 CLR從子類型(MyClass)及其基類型(Object)執行自動轉換。

相關問題