C# 使用新关键字

C# 使用新关键字,c#,new-operator,C#,New Operator,我对什么时候使用新的有点困惑。这两种说法的区别是什么: List<myObject> myData = GetDataFromDatabase(id); List myData=GetDataFromDatabase(id); 及 List myData=new List(); myData=GetDataFromDatabase(id); 对于第二次使用,Resharper向我发出以下警告: 局部变量myData仅被赋值,但其值从未被使用 GetDataFromDatabas

我对什么时候使用新的有点困惑。这两种说法的区别是什么:

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

List myData=new List();
myData=GetDataFromDatabase(id);
对于第二次使用,Resharper向我发出以下警告:

局部变量myData仅被赋值,但其值从未被使用

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


谢谢当创建对象的新实例时,您需要使用
new

如果调用返回实例的方法,它将使用
new
代替您

例如:

List<myObject> myData = GetDataFromDatabase(id)

List<myObject> GetDataFromDatabase(int id)
{
    // Here "they" used the new keyword.
    return new List<myObject>();        
}
List myData=GetDataFromDatabase(id)
列表GetDataFromDatabase(int id)
{
//这里“他们”使用了新的关键字。
返回新列表();
}

使用
new
实例化对象

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

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

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

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

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

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

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

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


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

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


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

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

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

新操作符的一些要点

  • 当我们的程序处于“运行时”状态时,一个新的操作员在一个新的环境中工作。编译器将创建运行时环境的实例
  • 若我们调用一个任意类的方法,编译器将检查实例的类
  • 我们有许多创建任意类的实例
  • 新运算符不能重载
  • 我们可以说,一个新的操作符创建了一个块(空间),我们的程序在其中执行
  • 创建程序的边界
  • 两个程序相互通信的对象的帮助。创建的对象,我非常了解新操作符
  • 下面是一个简单的程序,与新操作符一起使用

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

    实际上,不需要再次创建新的列表对象,因为您的方法
    GetDataFromDatabase(id)
    的任何方式都可能已经以返回
    列表的方式写入。因此,在您的示例中,首先用新列表初始化myData对象,然后用方法
    GetDataFromDatabase(id)
    返回的新列表替换它。因此,更好的做法可能是使用null初始化并从方法中获取值,然后直接分配给变量,或者另一种方法是在创建变量时直接调用FirstCase中显示的方法。您似乎不理解这个问题。你在这里说的似乎是正确的,但这并不是对实际问题的回答。
    myData = GetDataFromDatabase(id);  
    
    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();