我开始学习c#,但我不知道何时使用new
关键字,何时不使用它。一般我知道为什么要使用它,但是当我在互联网上查看一些代码时,我可以看到很多时候没有使用new
关键字 - 这些都是我使用它的地方。
示例:
static void FileInfoClass()
{
//this usage of new keyword i understand.
FileInfo somefile = new FileInfo("c:\\test.txt");
if (!somefile.Exists)
{
//this is the place where i would like to use new
//like FileStream somefileStream = new FileStream();
FileStream somefileStream = somefile.Create();
somefileStream.Close();
somefile = new FileInfo("c:\\test.txt");
}
//same like before
StreamWriter texttoAdd;
texttoAdd = somefile.CreateText();
texttoAdd.WriteLine("This is a line in the file");
texttoAdd.Flush();
texttoAdd.Close();
}
这是我能想到的最简单的例子。
答案 0 :(得分:2)
我以这种方式理解你的问题:你知道new
可以用来创建一个对象,所以你不明白为什么它不会用于新对象的每一个情况。出现"在你的代码中。
因此,您想知道这两行中的不同之处:
FileInfo somefile = new FileInfo("c:\\test.txt");
和
FileStream somefileStream = somefile.Create();
嗯,第二个不是对象的直接构造。实际上这个命令本身不会创建一个对象,它只是调用一个返回一个对象的函数。
假设函数被调用" Create()",我们可以猜测这个函数将创建一个对象并返回它(或者将调用另一个创建对象并返回它的函数)。但这只是一个惯例。该语言中没有任何内容表示该函数称为" Create()"应该真的创造对象。
因此,当您使用此功能时,您的代码不是负责创建对象的代码,因此您不能使用关键字new
。此模式称为Factory method。
答案 1 :(得分:1)
在C#中,new关键字可以用作运算符或修饰符。
new Operator
- 用于创建对象和调用构造函数。
new Modifier
- 用于隐藏基类成员中的继承成员。
new Constraint
- 用于限制可能在通用声明中用作类型参数的参数的类型。
<强> new Operator
强>
// cs_operator_new.cs
// The new operator
using System;
class NewTest
{
struct MyStruct
{
public int x;
public int y;
public MyStruct (int x, int y)
{
this.x = x;
this.y = y;
}
}
class MyClass
{
public string name;
public int id;
public MyClass ()
{
}
public MyClass (int id, string name)
{
this.id = id;
this.name = name;
}
}
public static void Main()
{
// Create objects using default constructors:
MyStruct Location1 = new MyStruct();
MyClass Employee1 = new MyClass();
// Display values:
Console.WriteLine("Default values:");
Console.WriteLine(" Struct members: {0}, {1}",
Location1.x, Location1.y);
Console.WriteLine(" Class members: {0}, {1}",
Employee1.name, Employee1.id);
// Create objects using parameterized constructors::
MyStruct Location2 = new MyStruct(10, 20);
MyClass Employee2 = new MyClass(1234, "John Martin Smith");
// Display values:
Console.WriteLine("Assigned values:");
Console.WriteLine(" Struct members: {0}, {1}",
Location2.x, Location2.y);
Console.WriteLine(" Class members: {0}, {1}",
Employee2.name, Employee2.id);
}
}
输出:
Default values:
Struct members: 0, 0
Class members: , 0
Assigned values:
Struct members: 10, 20
Class members: John Martin Smith, 1234
来源&amp;参考:Link
答案 2 :(得分:0)
new关键字用于创建新对象。
var someUser = new User();
例如,如果要创建用户的新实例,请使用new关键字。
一旦有了对象(User就是这种情况),那么就可以调用对象上的方法
someUser.UpgradeToPremiumAccount();
在您正在查看的代码中,他们正在创建一个新的FileInfo对象,然后在该对象上调用Exists方法。
对于StreamWriter,它们声明了一个名为texttoAdd的变量,但它们没有创建新对象。 someFile.CreateText();方法是创建对象并返回它,并将其存储在texttoAdd变量中。
答案 3 :(得分:0)
基本上,这归结为更有意义的内容以及哪些课程应该彼此了解。
想象一下,您就是设计FileInfo
和StreamWriter
类的人。现在,您需要为用户添加一些方法,以便从StreamWriter
创建FileInfo
。
您可以决定向StreamWriter
添加FileInfo
的新构造函数:
public StreamWriter(FileInfo fileInfo)
{
// some implementation, not important for us
}
或者您可以使用某些已存在的构造函数向FileInfo
添加创建StreamWriter
的方法:
public StreamWriter CreateText()
{
return new StreamWriter(this.FullPath);
}
他们两个都会奏效。所以,现在由您作为设计师来决定哪个选项更好。 StreamWriter
应该知道FileInfo
并将其作为构造函数参数接受吗?实际的设计师认为不,StreamWriter
应该使用文件名,而不是FileInfo
。因此,他们将CreateText()
方法添加到FileInfo
。
在这两种情况下,StreamWriter
对象最终都是使用new
创建的,但它可能隐藏在一些知道如何正确创建它的方法中。
答案 4 :(得分:0)
在行FileStream somefileStream = somefile.Create();
中,您不需要在此使用new
关键字,因为在Create
函数调用中,new
关键字用于实例化{ {1}}。您只需在直接调用对象构造函数时使用FileStream
。
您可以通过调用FileStream somefileStream = new FileStream(...);
手动创建new
。在这种情况下,有许多不同的方法可以创建FileStream
。甚至有File.Open(...)
。
.NET中的许多对象都有多种方法可以实例化它们。
无论你使用哪一个完全取决于你。
答案 5 :(得分:-1)
new关键字仅用于为对象分配内存。在您的情况下,您已经为someFile分配了内存。现在,您只是从create file返回一个文件对象,指向someFile。如评论中所述,您需要阅读返回类型,内存创建/对象分配。