使用新关键字

时间:2013-02-25 11:35:33

标签: c# new-operator

我对何时使用New感到有些困惑。这两个陈述有什么区别:

List<myObject> myData = GetDataFromDatabase(id);

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

对于第二种用法,Resharper给了我这个警告:

  

仅分配局部变量myData,但从不使用其值

GetDataFromDatabase(id)的返回类型为List(Of myObject)

由于

8 个答案:

答案 0 :(得分:4)

创建对象的新实例时,您需要使用new
如果您调用返回实例的方法,则使用new代替您。

例如:

List<myObject> myData = GetDataFromDatabase(id)

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

答案 1 :(得分:2)

使用new实例化对象。

GetDataFromDatabase的调用返回一个对象,由该函数决定实例化一个新对象,还是返回一个现有对象。

来自Resharper的警告是准确的。您的第二个代码块实例化一个新对象,并在myData中存储对该新对象的引用:

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

然后,您的代码会立即丢失该引用,将其替换为函数调用返回的内容:

myData = GetDataFromDatabase(id);  

换句话说,第一行,使用new的行是没有意义的,不应该出现。

答案 2 :(得分:0)

在第二个示例中,您将创建一个新对象。 您可以将myData的引用更改为另一个对象(由方法创建) 因此,您创建的对象没有对它的引用,它将在下一个垃圾收集周期中从内存中删除。简而言之,第二个例子毫无意义。 如果不使用它,为什么要创建一个新对象?

答案 3 :(得分:0)

new关键字为对象分配内存并返回对象的引用,因此您可以使用它。如果调用方法并且此方法返回对对象的引用,则不需要为此对象分配内存。

答案 4 :(得分:0)

如果您创建对象的New实例,则使用new关键字。我不知道方法GetDataFromDatabase是什么,我假设它返回一个列表,这就是为什么你可以使用方法调用实例化一个新列表。

这样,将要创建的新列表将是该方法返回的列表的副本。

简而言之,new关键字用于创建对象的新实例。有人称这是与其他班级的关系。

答案 5 :(得分:0)

如果GetDataFromDatabase函数返回List<myObject>的新实例,则实际上不需要创建new List<myObject>();然后GetDataFromDatabase(id);

使用new关键字时,您要求创建List<myObject>的新实例,但是当您使用myData = GetDataFromDatabase(id);时,您需要创建一个新实例,GC会收集前一个

答案 6 :(得分:0)

重塑器只是告诉您,您将值放入列表中,但您不对列表中的值执行任何操作。

答案 7 :(得分:0)

我同意所有答案。我会尝试根据一些有趣的观点程序员给出一个最好的例子。

新操作员的某些观点

  1. 一个新的操作员在我们的程序“运行时间”条件下工作。编译器创建运行时环境的实例。
  2. 如果我们调用任何类的方法,编译器将检查实例的类。
  3. 我们有很多创建任何类的实例。
  4. 新运算符无法重载。
  5. 我们可以说New运算符创建了一个程序块(空格)来执行程序。
  6. 创建程序的边界。
  7. 两个程序通信互为对象的帮助。创建的对象,我非常了解NEW operator。
  8. 以下与新操作员一起使用的简单程序。

    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();