「この」条項が異なるものは何ですか?
質問
次のコードがあります。
CustomerService service;
public CustomerService Service
{
get
{
if (this.service == null)
{
this.service = new CustomerService();
}
return this.service;
}
}
public DataTable GetCustomers()
{
return this.Service.GetCustomers();
}
さて、問題は次のとおりです。上記の方法を次のように書いた場合(「this」なし)、エラーを与えています。インスタンスはオブジェクトを参照していません。
public DataTable GetCustomers()
{
return Service.GetCustomers(); // this will spell the error "instance is not reference to an object"
}
誰か知っている?また、IIS経由で実行中にのみ発生し、Casini Webサーバーからではありません(VS 2010)。
解決
の有無 this
あなたが目撃しているエラーを説明することはできません。この状況では、それらはまったく同じことを意味し、同じILコードにコンパイルします。 .NETリフレクターを使用してアセンブリを確認して、必要に応じてこれを確認してください。エラーは、おそらく人種状態のためにランダムに発生しています。
私がすぐに見ることができることの1つは、複数のスレッドからこのコードを実行している場合、ここでレース条件があるように見えることです。
if (this.service == null)
{
this.service = new CustomerService();
}
return this.service;
マルチスレッドの場合、ロックする必要があります。これがあなたのエラーを説明するかどうかはわかりませんが、それは確かに混乱を引き起こす可能性があります。レース条件は、ある環境で発生する可能性がありますが、エラーの頻度はハードウェアのタイプとサーバーで実行されている他のプロセスに依存する可能性があるため、別の環境では発生しません。
また、投稿していないコードに他のレース条件がある場合があります. 。あなたがそうでない限り、ロックせずにこの怠zyな初期化手法を使用しないでください 承知しました スレッドが1つしかないこと。
他のヒント
おそらく、別の「サービス」(クラスまたは名前空間)と名前が競合するでしょう。の用法 this
それを解決します。
私はカシニンとIISの違いについて少し懐疑的です、あなたはそれを注意深くチェックしましたか?
このようなものは、にあるべきです シングルトン. 。これにより、正しく実装された場合、スレッドなどの多くの問題が解決し、コードの実装と読みやすさがはるかに優れています。
ありがとう-BLAKENIEMYJSKI(.Nettiersチームメンバー)
私はあなたのコードをVisual Studioで少しいじりましたが、あなたが説明したエラーメッセージを作成するために名前の競合を取得することさえできませんでした。 「x」が「x」とは違います。 ローカル変数 またはa メソッドパラメーター.
だろうか CustomerService
クラスは、呼ばれる基本クラスから派生します Service
?もしそうなら、それが問題です。