我什么时候可以使用新关键字?

时间:2013-01-30 20:40:20

标签: c#

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

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

6 个答案:

答案 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)

基本上,这归结为更有意义的内容以及哪些课程应该彼此了解。

想象一下,您就是设计FileInfoStreamWriter类的人。现在,您需要为用户添加一些方法,以便从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。如评论中所述,您需要阅读返回类型,内存创建/对象分配。