2013-02-25 52 views
2

我對什麼時候使用New有些困惑。是什麼這兩個語句之間的區別:使用新的關鍵字

List<myObject> myData = GetDataFromDatabase(id); 

List<myObject> myData = new List<myObject>(); 
myData = GetDataFromDatabase(id); 

對於第二個使用ReSharper的給了我這樣的警告:

局部變量myData的只分配,但它的價值是從未使用過

返回類型GetDataFromDatabase(id)List(Of myObject)

感謝

+0

其實無需再次createa新的列表對象,因爲任何如何你的方法'GetDataFromDatabase(ID)'可能已經在它返回一個'List'這樣寫的。所以在你的情況下,你首先用新列表初始化myData對象,然後用'GetDataFromDatabase(id)'方法返回的新列表替換它。所以更好的做法可能是用null初始化並從方法中獲取值並直接賦值給變量,或者另一種做法是在創建變量時直接調用你以第一種方式顯示的方法 – 2013-02-25 11:41:22

回答

4

您需要使用new創建一個對象的新實例。
如果您調用一個返回實例的方法,它將使用new而不是您。

例如:

List<myObject> myData = GetDataFromDatabase(id) 

List<myObject> GetDataFromDatabase(int id) 
{ 
    // Here "they" used the new keyword. 
    return new List<myObject>();   
} 
2

您使用new實例化一個對象。

GetDataFromDatabase的調用返回一個對象,並由該函數實例化一個新對象或返回一個現有對象。

Resharper的警告是準確的。你的代碼第二塊實例化一個新對象,並存儲在myData到新對象的引用:

List<myObject> myData = new List<myObject>(); 

你的代碼,然後立即用無論是從函數調用返回替換它丟失了參考:

myData = GetDataFromDatabase(id); 

換句話說,第一行,使用new的第一行是毫無意義的,不應該存在。

0

在第二個示例中,您將創建一個新對象。 您可以將myData的引用更改爲另一個對象(由方法創建) ,因此您創建的對象對它沒有引用,它將在下一個垃圾回收循環中從內存中移除。總之,第二個例子沒有意義。 爲什麼創建一個新的對象,如果你不使用它?

0

new關鍵字爲對象分配內存並返回對象的引用,因此您可以使用它。如果你調用一個方法並且這個方法返回一個對象的引用,你不需要爲這個對象分配內存。

0

如果您創建對象的實例,則使用新關鍵字。不知道GetDataFromDatabase是什麼方法,我假設它正在返回一個列表,這就是爲什麼你可以使用方法調用實例化一個新列表。

因此,將要創建的新列表將是該方法返回的列表的副本。

簡而言之,new關鍵字用於創建對象的新實例。有些人稱這是與其他班級的關係。

0

如果GetDataFromDatabase函數返回的List<myObject>新實例,你實際上並不需要創建new List<myObject>();,然後GetDataFromDatabase(id);

當使用關鍵字new你問打造List<myObject>一個新的實例,但是當你用myData = GetDataFromDatabase(id);你正在裝一個新的,GC將收集前一個

0

整形器只是告訴你,你把值放入列表中,但是你不會對列表中的值做任何事情。

0

我同意所有的答案。我會嘗試根據一些有趣的觀點程序員給出一個最好的例子。

在一些點新運營商

  1. 一個新的運營工作時,我們的程序「運行時間」條件。編譯器創建運行時環境的一個實例。
  2. 如果我們調用任何一個類的方法,編譯器會檢查一個類的實例。
  3. 我們有很多創建任何類的實例。
  4. 新運算符不能超載。
  5. 我們可以說一個新的操作符在我們的程序執行的地方創建一個塊(空間)。
  6. 創建程序的邊界。
  7. 兩個程序通訊相互幫助的對象。創建的對象,我非常瞭解NEW操作符。

一個簡單的程序,下面與新的操作符一起使用。

class Program 
{ 
    int x = 20; 
    public void pro1() 
    { 
     Console.WriteLine(this.x); 

     Console.WriteLine("pr1 call"); 


    } 
} 
static class porgram2 
{ 
    static int x = 10; 
    public static void pro2() 
    { 
    Console.WriteLine( porgram2.x); //Not need a object 
     Console.WriteLine("pro2 call"); 
            // This keyword is not allowed. 

    } 

    static void Main(string[] args) 
    { 

     porgram2.pro2(); // no need a object created. 
     Program pr = new Program();//Must be a created object. 
     pr.pro1(); 
     Program pr2 = new Program(); // i have many time of create a object. 
     pr2.pro1(); 
+0

你不'似乎已經理解了這個問題。你在這裏所說的話似乎是正確的,但這不是對實際提出的問題的回答。 – 2013-03-03 06:54:57