2017-04-30 4 views
0

私はここで本当に単純なものが欠けているように感じます。次のようにコードがある:このコードをコンパイルすると汎用メソッド内から呼び出されたときに変数に値が割り当てられることはありません

public partial class DatabaseService : ServiceBase 
{ 
    internal static ServiceHost incomingCallServiceHost; 
    internal static ServiceHost personServiceHost; 

    public DatabaseService() 
    { 
     InitializeComponent(); 
    } 

    private void StartService<TService>(ServiceHost svchost) 
    { 
     svchost?.Close(); 
     svchost = new ServiceHost(typeof(TService)); 
     svchost.Open(); 
    } 

    private void StopService(ServiceHost svchost) 
    { 
     if (svchost != null) 
     { 
      svchost.Close(); 
      svchost = null; 
     } 
    } 

    protected override void OnStart(string[] args) 
    { 
     try 
     { 
      StartService<IncomingCallService>(incomingCallServiceHost); 
      StartService<PersonService>(personServiceHost); 
     } 
     catch(System.Exception ex) 
     { 
      EventLog.WriteEntry(ex.Message); 
     }   
    } 

    protected override void OnStop() 
    { 
     StopService(incomingCallServiceHost); 
     StopService(personServiceHost); 
    } 
} 

、2つのServiceHostの変数が初期化されることはありませんし、常にnullになることを警告があります。

変数を初期化するための唯一の方法は、StartServiceメソッドからコードを取り込み、OnStartメソッドに入れて、重複したコードを作成することです。

protected override void OnStart(string[] args) 
{ 
    try 
    { 
     incomingCallServiceHost?.Close(); 
     incomingCallServiceHost = new ServiceHost(typeof(IncomingCallService)); 
     incomingCallServiceHost.Open(); 

     personServiceHost?.Close(); 
     personServiceHost = new ServiceHost(typeof(PersonService)); 
     personServiceHost.Open(); 
    } 
    catch(System.Exception ex) 
    { 
     EventLog.WriteEntry(ex.Message); 
    }   
} 

ここでは一般的な方法で動作するはずですが、そうではないように感じます。どうしてこれなの?

+2

これをそのまま動作させたい場合は、StartService(ref ServiceHost svchost)を参照する必要があります。 – Evk

+0

それはそれを修正したようです。なぜrefキーワードを使用する必要があるのか​​説明できますか? – Jake

+0

StartService内のsvchostパラメータに新しい値を割り当てるためです。コメントの詳細を説明するには時間がかかりすぎます.- refキーワードに関するドキュメントを読むだけです - https://msdn.microsoft.com/en-us/library/14akc2c7.aspx – Evk

答えて

0

Evkには正しい答えがありました。 ServiceHostパラメーターでrefキーワードを使用する必要がありました。

関連する問題