-1

我开始学习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();
}

这是我能想到的最简单的例子。

4

6 回答 6

2

我这样理解你的问题:你知道它new可以用来创建一个对象,所以你不明白为什么它不用于代码中“出现”新对象的每种情况。

因此,您想知道这两行有什么不同:

FileInfo somefile = new FileInfo("c:\\test.txt");

FileStream somefileStream = somefile.Create();  

好吧,第二个不是对象的直接构造。实际上这个命令本身并没有创建对象,它只是调用了一个返回对象的函数。

鉴于该函数名为“Create()”,我们可以猜测该函数将创建一个对象并返回它(或者将调用另一个创建对象并返回它的函数)。但这只是一个约定。语言中没有任何内容说名为“Create()”的函数应该真正创建对象。

因此,当您使用此功能时,您的代码不是负责创建对象的代码,因此您不使用关键字new. 这种模式称为工厂方法

于 2013-01-30T21:16:35.527 回答
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

来源和参考:链接

于 2013-01-30T20:55:46.550 回答
0

new 关键字用于创建新对象。

var someUser = new User();

例如,当您想要创建用户的新实例时,您使用 new 关键字。

一旦你有了对象(用户就是这种情况),那么你可以调用对象上的方法

someUser.UpgradeToPremiumAccount();

在您正在查看的代码中,他们正在创建一个新的 FileInfo 对象,然后对该对象调用 Exists 方法。

对于 StreamWriter,他们声明了一个名为 texttoAdd 的变量,但他们没有创建一个新对象。someFile.CreateText(); 方法正在创建对象并返回它,并将其存储在 texttoAdd 变量中。

于 2013-01-30T20:45:05.293 回答
0

基本上,这归结为更有意义的内容以及哪些类应该相互了解。

想象一下,您是设计FileInfoStreamWriter类的人。现在您需要为用户添加一些StreamWriterFileInfo.

您可以决定向其中添加新的构造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应该使用文件名,而不是FileInfos。所以他们将CreateText()方法添加到FileInfo.

在这两种情况下,StreamWriter对象最终都是使用 创建的new,但它可能隐藏在某些知道如何正确创建它的方法中。

于 2013-01-30T20:59:33.247 回答
0

在该行中FileStream somefileStream = somefile.Create();,您不需要在new此处使用关键字,因为在Create函数调用中,new关键字被用于实例化FileStream. new只有在直接调用对象构造函数时才需要使用。

您可以FileStream通过调用手动创建FileStream somefileStream = new FileStream(...);。在这种情况下,您可以通过多种不同的方式创建FileStream. 甚至还有File.Open(...)

.NET 中的许多对象都有多种实例化它们的方法。

无论您使用哪个完全取决于您。

于 2013-01-30T21:06:20.330 回答
-1

new 关键字仅用于为对象分配内存。在您的情况下,您已经为 someFile 分配了内存。现在您只是从创建文件返回一个文件对象以指向 someFile 。就像您需要阅读的关于返回类型、内存创建/对象分配的评论中所指出的那样。

于 2013-01-30T20:46:38.250 回答