使用新关键字
本文关键字:关键字 | 更新日期: 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将收集前一个
整形器只是告诉您,您将值放入列表中,但不会对列表中的值执行任何操作。
我同意所有答案。我将尝试根据一些有趣的程序员的观点给出一个最好的例子。
新运营商的一些观点
- 当我们的程序处于"运行时间"条件时,一个新的操作员工作。编译器创建运行时环境的一个实例
- 如果我们调用任何一个类的方法,编译器将检查实例是否为类
- 我们有许多创建任意类的实例
- 新运算符不能重载
- 我们可以说一个New操作符创建了一个执行程序的块(空间(
- 创建程序的边界
- 两个程序互相交流的对象。被创建的对象,我很熟悉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();