2009-03-07 7 views
1

別のクラス(インスタンスベース)からのインスタンスデータを使用する静的メソッドを見ましたが(コードは実行しませんでした)インスタンスフィールドで動作する静的メソッド

通常、インスタンスデータは、staticフィールド/メソッドのインスタンスメソッドと同様に動作します。インスタンスメソッドで静的データを扱うことの意義は何ですか?私はそれが怒っていると仮定しているが、私はボンネットの下で何が起こるのかについての詳細を見つけることができない。また、静的データを扱うインスタンスメソッドはどうですか?

おかげ

+1

「静的メソッドからインスタンスデータを処理する意味は何ですか? – thomasrutter

答えて

0

インスタンスメソッドで静的データを扱う場合、私が考えることができるのは、マルチスレッドアプリケーションでの同期だけです。私は静的メソッドからインスタンスデータを扱うときに悪影響を考えることはできません。しかし、ちょうど何かがすることができますそれを意味するわけではありませんする必要があります。

ここでは、指定した具体例を示します。

クラスAは、インスタンスベースであり、二重の のProductPrice呼ば インスタンスフィールドを持っています。クラスBは静的であり、 PlayAroundWithPrice(倍精度)と呼ばれる 静的メソッドを持ち、 コーダーはProductPrice フィールドを渡します。

もちろん、そこにこの例では何も技術的に違法ではありませんが、それは私のために穀物に反します。まずクラスAのProductPriceフィールドは、クラスBが操作できるため、明らかに公開されています。カプセル化の目的のために、私は個人的にフィールドをプライベートにし、アクセスするためにパブリックプロパティを使用します。次に、ProductPriceはパブリックプロパティではなくパブリックフィールドなので、Class AがProductPriceが無効な値(負の値など)に設定されるのを防ぐ方法はありません。三番目(前述)のように、この例題がマルチスレッドのプログラムで発生すると、同期の問題が発生する可能性があります。第4に、私はこれが本当のこすりだと思います、なぜクラスBの静的メソッドをクラスAのフィールドで操作するのですか?静的メソッドをクラスAに配置してみませんか?

私はこれを固くて速いルール(おそらく単純なルール)にすることはできませんが、静的メソッドを使用することで、メソッドを使用するためだけにオブジェクトを作成するコストを支払うこと。

たとえば、私が作業しているプロジェクトでは、IPHeaderクラスがあり、これはバイトバッファからIPHeaderインスタンスを完全に構築します。しかし、ほとんどの場合、私はIPHeaderから2つの値しか必要としません。だから、IPHeaderインスタンスの作成とガベージコレクションに関連するコストを避けるために、バイトバッファから値を直接抽出する静的メソッドをいくつか追加しました。

私はあなたの質問を正しく理解してくれることを願っています。

0

基本的に、インスタンスメソッドは、メソッドがオン動作するようになっているインスタンスを渡すために使用される隠れthisパラメータを有しています。これは、静的メソッドが明示的な参照なしでインスタンスデータにアクセスすることができない理由です(アクセスすべきオブジェクトのインスタンスがわからないため)。これを考慮

、私は、静的およびインスタンスメソッドの間に特別な違いは表示されません。それらは両方の方法であり、相違点よりも類似点があります。

静的データおよびインスタンスデータの両方が、スレッドの問題を起こしやすい、しかし、インスタンスは、スレッド間で使用されるはるかに少ない可能性があります。その結果、静的フィールドにアクセスする場合は、(同期の問題に関して)より多くの注意が必要になることがあります。

1

スタティックメソッド内の別のオブジェクトのインスタンスデータに問題がないとは限りません。

私は、パラメータを使用して静的なメソッドに、オブジェクトのインスタンス変数を渡す、たとえば、あなたが意味することを想定し、その方法は、その変数に取り組んでいます。

は静的はちょうどあなたがこのを得ることはありません意味しますが、あなたが得ることができotherobject->

が、私はそれはそれ以上のひんしゅくを買うことになるとは思わない何かだけだろう静的メソッドを使用するよりも最初は

+0

私は質問を理解したいと思っています:) – thomasrutter

+0

こんにちは、私はこの意味:クラスAは、インスタンスベースであり、二重のProductPriceと呼ばれるインスタンスフィールドを持っています。クラスBは静的で、PlayAroundWithPrice(倍精度)と呼ばれる静的メソッドを持ち、コーダはProductPriceフィールドを渡します。何かそれに間違っている? – dotnetdev

+0

ああ、私が上で説明したもの(インスタンス変数を静的メソッドにパラメータとして渡す)と非常によく似ています。最初は静的メソッドに納得している限り、何か問題はないとは思わない。 – thomasrutter

0

問題はありません。最近、私は別の、しかし再現性のあるランダムな種を持つためにクラスの各インスタンスが必要なシナリオを持っていました。私はクラス内にプライベート静的intを保持し、すべてのインスタンス化のためにそれをインクリメントし、それをシードとして使用しました。

正常に機能しました。

0

私はインスタンスメソッド内の静的データを使用してと、本質的に何か問題があるとは思わないが、私はあなたが本当にあなたが使用するデータの種類を制限する必要があると思います。このアプローチの利点/欠点は、単一のデータ変更が特定のタイプのすべてのオブジェクトの動作を変更できることです。これは、そのタイプのデータを非常に危険なものに変更することになります。何も変更することはできませんので程度

  • グローバルオブジェクトを心配することは何もない - - 私はこれをやってから強くリフレイン私がいることを見つけた私は

    1. 不変値以下のシナリオにこれの用途を制限する傾向がありますグローバルオブジェクトを持つという弊害がリスクを上回ることもあります。これらのオブジェクトは慎重に監視され、大量のテストが行​​われます。
  • 1

    静的メソッド用オブジェクトインスタンスまたは静的データを使用してインスタンスメソッドを有する問題はありません。

    フレームワークには、これを実証する方法がたくさんあります。例えば、非常に一般的に使用されるString.Concatメソッドは、1つ以上のオブジェクトインスタンスをとる静的メソッドです。 (Concatメソッド呼び出しは、+演算子を使用して文字列を連結するたびにコンパイラが生成するものです。)

    Int32.MaxValueは静的プロパティですが、インスタンスメソッドではそれを使用することは明らかです。

    関連する問題