5

「Place」というクラスに場所と関連する詳細が格納されているとします。

class Place
{
    string Name;
    string Location;
    // etc...
}

その後、最大80の異なる町の名前と詳細を入力します。したがって、これらの町を数値的に配列に格納します。

class Setup
{
    public static GetTowns
    {
        for (int i = 1; i <= numberOfTowns; i++)
        {
            Town[i] = new Place(name, location);
        }
        // more code...
    }
    // more methods...
}

特定のタウンとそのデータにアクセスするには、タウン自体をパラメーターとして渡し、それを受け取ります。

public static void DescribeTown(Place Town)
{
    // example method from some other class
    Console.WriteLine("Shipping to {0}.", Town.Name);
}

他の方法では、複数の町、またはそれらすべてにアクセスする必要があります。次に、Town配列全体をパラメーターとして渡すことができます。

public static void ListAllTowns(Place[] Town)
{
    Console.WriteLine("Our Beloved Clients:");
    foreach (Place here in Town)
    {
        Console.WriteLine("{0} in {1}", here.Name, here.Location);
        // Various other operations requiring info about the Towns
    }
}

完全なリファレンス、C#2.0には、次のように記載されています。

パラメータは、メソッドが呼び出されたときにメソッドに渡される引数の値を受け取る変数です。

ListAllTownsこれは、クラスのすべてのインスタンス、および関連するすべてのデータが、呼び出されるたびに渡されることを示しているようです。それは私には無駄に聞こえますが、そうですか?

(この例は、概念実証の理由で大幅に簡略化されていますが、メソッドには読み取り/書き込み権限と複数のタウン間の比較が必要です。)

4

6 に答える 6

7

それについて無駄なことは何もありません。すべてのアイテムのコピーを渡すのではなく、配列を作成してから、その配列への参照をListAllTownsメソッドに渡すだけです(配列は参照型です)。

あなたは正しい方法で物事を行っています。

于 2012-08-21T16:11:21.563 に答える
4

パラメータは常に値によって渡されます(refまたはoutキーワードが使用されている場合を除く)が、参照型の場合、値はオブジェクト自体ではなく、オブジェクトへの参照です。

したがって、オブジェクト全体がパラメータとして渡されるのではなく、オブジェクトへの参照のみが渡されます。

于 2012-08-21T16:12:07.390 に答える
2

C#のすべてのクラスはデフォルトで参照であるため、ポインターのみが関数に送信されます。

あなたの質問に答える:それは状況次第です。オブジェクト全体をパラメーターとして送信することが実際に意味をなす場合があります(つまり、オブジェクトを使用して何かを送信しようとしています)。一方、関数パラメーター専用のクラスを作成するのはおそらく良いことではありません。あなたの特定の例では、クラスを作成することは理にかなっています。

私が今言ったことからの1つの例外:構造体はコピーとして送信されています(すべてのメンバーがコピーされます)。これらを関数パラメータとして送信するときは注意が必要です。

于 2012-08-21T16:13:17.967 に答える
1

.NETでは、オブジェクトは参照として保持されます。この場合、データ全体を渡したりコピーしたりするのではなく、そのデータのすでに作成されたインスタンスへの参照を使用します。

このコンテキストでは、一貫性を保つことができるため、インスタンス全体を渡すことをお勧めします(Townsを処理するメソッドがTownsをパラメーターとして取得することは理にかなっています)

于 2012-08-21T16:14:59.810 に答える
1

それは常にジレンマです。

一方では、オッカムの剃刀は、過度のことは何も必要ないと言っていますが、変更DescribeTown(Place Town)するDescribeTown(string TownName)ということは、OOPの方法ではないことを意味します。つまり、コードを変更したり、将来的に維持したりするのが難しくなることを意味します。

ただし、システムが成熟して安定している場合や、全体がまだ過剰であることが判明した場合はTown、にリファクタリングして戻すことができますDescribeTown(string TownName)

もう1つの側面-ユニットテスト。DescribeTown(string TownName)メソッドのテストはDescribeTown(Place Town)、よりも簡単です。後者では、Townオブジェクトをモックする必要があり、どのプロパティをモックする必要があるかは明確ではありません(テストする前にそれを知っている必要があります)。

于 2012-08-21T16:37:54.587 に答える
0

私の意見では、クラスを引数として渡すことはまったく問題ありません。これは、Robert MartinsCleanCodeを含むさまざまな作成者によってバックアップされています。また、可能であればパラメータを渡さないようにするべきだと思いました。Townオブジェクトの配列をListAllTownsメソッドに渡す代わりに、「ListAll」をPlaceクラスのメソッドにした場合は、次のようにメソッドを呼び出します。

Towns.ListAll()

この意味では、関数が所有するオブジェクトを操作しているだけなので、関数を使用するたびにリストを関数に渡す必要はありません。

于 2012-08-21T16:18:13.057 に答える