2

Newをいつ使用するかについて少し混乱しています。この2つのステートメントの違いは何ですか。

List<myObject> myData = GetDataFromDatabase(id);

List<myObject> myData = new List<myObject>();
myData = GetDataFromDatabase(id);  

2回目の使用では、Resharperは次の警告を表示します。

ローカル変数myDataは割り当てられるだけですが、その値は使用されません

の戻りタイプはGetDataFromDatabase(id)ですList(Of myObject)

ありがとう

4

8 に答える 8

4

オブジェクトの新しいインスタンスを作成するnewときに使用する必要があります。 インスタンスを返すメソッドを呼び出すと、代わりにインスタンスが使用されます。
new

例えば:

List<myObject> myData = GetDataFromDatabase(id)

List<myObject> GetDataFromDatabase(int id)
{
    // Here "they" used the new keyword.
    return new List<myObject>();        
}
于 2013-02-25T11:37:32.623 に答える
2

newオブジェクトをインスタンス化するために使用します。

の呼び出しはオブジェクトをGetDataFromDatabase返します。新しいオブジェクトをインスタンス化するか、既存のオブジェクトを返すかは、その関数次第です。

Resharperからの警告は正確です。コードの2番目のブロックは、新しいオブジェクトをインスタンス化し、その新しいオブジェクトへの参照を次の場所に格納しますmyData

List<myObject> myData = new List<myObject>();

次に、コードは、関数呼び出しから返されたものに置き換えることで、その参照をすぐに失います。

myData = GetDataFromDatabase(id);  

言い換えれば、最初の行、使用した行newは無意味であり、存在してはなりません。

于 2013-02-25T11:37:44.837 に答える
0

2番目の例では、新しいオブジェクトを作成します。myDataの参照を別のオブジェクト(メソッドによって作成されたもの)に変更すると、作成したオブジェクトには参照がなくなり、次のガベージコレクションサイクルでメモリから削除されます。つまり、2番目の例は意味がありません。使用しないのになぜ新しいオブジェクトを作成するのですか?

于 2013-02-25T11:38:26.917 に答える
0

キーワードはnewオブジェクトにメモリを割り当て、オブジェクトへの参照を返すため、それを使用できます。メソッドを呼び出し、このメソッドがオブジェクトへの参照を返す場合、このオブジェクトにメモリを割り当てる必要はありません。

于 2013-02-25T11:38:34.567 に答える
0

Newオブジェクトのインスタンスを作成する場合は、newキーワードが使用されます。メソッドGetDataFromDatabaseが何であるかを知らなくても、リストを返していると想定しているので、メソッド呼び出しを使用して新しいリストをインスタンス化できます。

作成される新しいリストが、メソッドによって返されるリストのコピーになるようにします。

つまり、newキーワードは、オブジェクトの新しいインスタンスを作成するために使用されます。これを他のクラスとの関係と呼ぶ人もいます。

于 2013-02-25T11:39:12.123 に答える
0

GetDataFromDatabase関数が新しいインスタンスを返す場合は、実際に作成しList<myObject>てから作成する必要はありません。new List<myObject>();GetDataFromDatabase(id);

newの新しいインスタンスを作成するように要求しているキーワードを使用するList<myObject>場合、新しいインスタンスを作成するmyData = GetDataFromDatabase(id);と、GCは前のインスタンスを収集します

于 2013-02-25T11:39:13.410 に答える
0

リシェーパーは、値をリストに入れることを通知するだけですが、リスト内の値には何もしません。

于 2013-02-25T11:39:39.867 に答える
0

私はすべての答えに同意します。いくつかの興味深い視点のプログラマーに従って、最良の例を挙げてみます。

新しいオペレーターのいくつかのポイント

  1. 新しいオペレーターは、プログラムの「RUNTIME」条件で動作します。コンパイラは、ランタイム環境のインスタンスを作成します。
  2. 任意のクラスのメソッドを呼び出すと、コンパイラはインスタンスのクラスをチェックします。
  3. createanyクラスのインスタンスがたくさんあります。
  4. 新しい演算子はオーバーロードできません。
  5. New演算子は、プログラムが実行されるブロック(スペース)を作成すると言うことができます。
  6. プログラムの境界を作成します。
  7. 2つのプログラム通信は、オブジェクトを相互に助けます。作成されたオブジェクト、NEW演算子はよく知っています。

new演算子で使用される以下の簡単なプログラム。

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();
于 2013-02-25T14:04:07.693 に答える