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);
}
}
ここでは一般的な方法で動作するはずですが、そうではないように感じます。どうしてこれなの?
これをそのまま動作させたい場合は、StartService(ref ServiceHost svchost)を参照する必要があります。 – Evk
それはそれを修正したようです。なぜrefキーワードを使用する必要があるのか説明できますか? – Jake
StartService内のsvchostパラメータに新しい値を割り当てるためです。コメントの詳細を説明するには時間がかかりすぎます.- refキーワードに関するドキュメントを読むだけです - https://msdn.microsoft.com/en-us/library/14akc2c7.aspx – Evk