2

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

List<myObject> myData = GetDataFromDatabase(id);

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

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

局部变量 myData 只被赋值,但它的值从未被使用

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

谢谢

4

8 回答 8

4

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

例如:

List<myObject> myData = GetDataFromDatabase(id)

List<myObject> GetDataFromDatabase(int id)
{
    // Here "they" used the new keyword.
    return new List<myObject>();        
}
于 2013-02-25T11:37:32.623 回答
2

new用来实例化一个对象。

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

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

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

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

myData = GetDataFromDatabase(id);  

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

于 2013-02-25T11:37:44.837 回答
0

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

于 2013-02-25T11:38:34.567 回答
0

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

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

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

于 2013-02-25T11:39:12.123 回答
0

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

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

于 2013-02-25T11:39:13.410 回答
0

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

于 2013-02-25T11:39:39.867 回答
0

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

于 2013-02-25T11:38:26.917 回答
0

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

新运营商的一些观点

  1. 当我们的程序“运行时间”条件时,一个新的操作员工作。编译器创建一个运行时环境的实例。
  2. 如果我们调用任何类的方法,编译器将检查该类的实例。
  3. 我们有许多创建任何类的实例。
  4. new 运算符不能重载。
  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();
于 2013-02-25T14:04:07.693 回答