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