-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.オブジェクトの作成に使用できることを知っているので、コードに新しいオブジェクトが「現れる」すべてのケースでなぜそれが使用されないのか理解できません.

したがって、次の 2 つの行の違いを知りたいと考えています。

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

FileStream somefileStream = somefile.Create();  

2 つ目は、オブジェクトを直接構築したものではありません。実際には、このコマンド自体はオブジェクトを作成しません。オブジェクトを返す関数を呼び出すだけです。

関数が「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();

たとえば、User の新しいインスタンスを作成する場合は、new キーワードを使用します。

オブジェクトを取得したら (この場合はユーザー)、オブジェクトのメソッドを呼び出すことができます

someUser.UpgradeToPremiumAccount();

ご覧のコードでは、新しい FileInfo オブジェクトを作成し、そのオブジェクトで Exists メソッドを呼び出しています。

StreamWriter の場合、texttoAdd という名前の変数を宣言していますが、新しいオブジェクトを作成していません。someFile.CreateText(); メソッドはオブジェクトを作成して返し、texttoAdd 変数に格納されています。

于 2013-01-30T20:45:05.293 に答える
0

基本的に、これは何がより理にかなっており、どのクラスがお互いについて知っておくべきかということになります。

あなたがFileInfoandStreamWriterクラスを設計していると想像してください。StreamWriterここで、ユーザーがから作成する方法を追加する必要がありますFileInfo

次を受け取る新しいコンストラクターを追加することを決定できStreamWriterますFileInfo

public StreamWriter(FileInfo fileInfo)
{
    // some implementation, not important for us
}

または、すでに存在する using some コンストラクターを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();を使用する必要はありません。関数呼び出し内でキーワードを使用して. オブジェクト コンストラクターを直接呼び出す場合にのみ使用する必要があります。newCreatenewFileStreamnew

FileStreamを呼び出して手動で作成できますFileStream somefileStream = new FileStream(...);。これは、さまざまな方法で を作成できる場合ですFileStream。さえありFile.Open(...)ます。

.NET の多くのオブジェクトには、インスタンス化する方法が複数あります。

どちらを使用するかは完全にあなた次第です。

于 2013-01-30T21:06:20.330 に答える
-1

new キーワードは、オブジェクトにメモリを割り当てるためにのみ使用されます。あなたの場合、すでにsomeFileにメモリを割り当てています。これで、create file から someFile を指すファイル オブジェクトを返すだけです。コメントに記載されているように、戻り値の型、メモリの作成/オブジェクトの割り当てについて読む必要があります。

于 2013-01-30T20:46:38.250 に答える