2013-02-25 105 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