使用新关键字

本文关键字:关键字 | 更新日期: 2023-09-27 18:01:03

我对何时使用New有点困惑。这两种说法有什么区别:

List<myObject> myData = GetDataFromDatabase(id);

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

对于第二次使用,Resharper给我这个警告:

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

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

感谢

使用新关键字

创建对象的新实例时,需要使用new
如果您调用一个返回实例的方法,则它使用new而不是您。

例如:

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

使用new实例化对象。

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

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

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

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

myData = GetDataFromDatabase(id);  

换句话说,第一行,即使用new的那一行是没有意义的,不应该存在。

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

new关键字为对象分配内存,并返回对该对象的引用,因此您可以使用它。如果您调用了一个方法,而该方法返回了对对象的引用。则无需为该对象分配内存。

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

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

简而言之,new关键字用于创建对象的新实例。有些人称之为与其他类的has-a关系。

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

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

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

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

新运营商的一些观点

  1. 当我们的程序处于"运行时间"条件时,一个新的操作员工作。编译器创建运行时环境的一个实例
  2. 如果我们调用任何一个类的方法,编译器将检查实例是否为类
  3. 我们有许多创建任意类的实例
  4. 新运算符不能重载
  5. 我们可以说一个New操作符创建了一个执行程序的块(空间(
  6. 创建程序的边界
  7. 两个程序互相交流的对象。被创建的对象,我很熟悉NEW操作符

下面的一个简单程序与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();