どちらか一方の場合には、ローカル変数とプライベートフィールドの有効性との比較
私は非常に頻繁に使用される方法を持っているジレンマを持っているので、私は好奇心が強いです。かなり大きいカスタムクラスタイプを返します。私が新しいクラスを持っていた場合にはそうであるように、新しいカスタムオブジェクト全体を作成するのではなく、フィールド内でこのカスタムクラスのインスタンスを保持する方が安いのではないかと思っています。メソッドで毎回作成されるインスタンス。
どちらか一方の場合には、ローカル変数とプライベートフィールドの有効性との比較
私は非常に頻繁に使用される方法を持っているジレンマを持っているので、私は好奇心が強いです。かなり大きいカスタムクラスタイプを返します。私が新しいクラスを持っていた場合にはそうであるように、新しいカスタムオブジェクト全体を作成するのではなく、フィールド内でこのカスタムクラスのインスタンスを保持する方が安いのではないかと思っています。メソッドで毎回作成されるインスタンス。
あなたが求めているのは、いわゆるレイジーフィールドです。あなたはSystem.Lazy<>
ので
private System.Lazy<YourClass> mYourClassInstance;
...
mYourClassInstance = new System.Lazy<YourClass>(() => new YourClass());
としてそれを宣言してから、あなたはどこでもあなたが欲しいけど値(インスタンス)を一度だけ作成され
mYourClassInstance.Value
経由でインスタンスを取得することができます。
新しく作成されたクラスのインスタンスを返すこととフィールドを返すことの大きな違いは、後者の場合、すべてのクライアントが同じインスタンスへのポインタを受け取るため、インスタンスが共有されることです。つまり、クライアントのいずれか(またはインスタンスの元の作成者)がインスタンス内で何かを変更するたびに、すべてのクライアントにすべての変更が表示されます。前者の場合、すべてのインスタンスが異なり、変更は現在のクライアントにのみ影響します。
要件をよく見て、どの動作が必要であるかを確認します。それらを間違えると壊滅的な影響を受けることがあります。
この重大な問題に対処するための最初の答え、 ! –
はい、ルールがあり、非常に簡単です:ローカル変数が必要な場合は、ローカル変数を使用します。フィールドが必要な場合は、フィールドを使用します。 – dasblinkenlight
2つは機能的には異なるものですが、動作の変更がOKかどうか最初に検証する必要があります。 –
クラスの*インスタンス*(クラスを返すことはできません)を返すと、その参照が返されます。オブジェクトは、ローカル変数またはフィールドであるかどうかにかかわらず、ヒープ上に残ります。また、フィールド変数とローカル変数の選択は、効率性の問題ではなく機能性の問題です。 – Sefe