none
Timerクラス RRS feed

  • 質問

  • C#初心者です。

    VisualStudio2015でC#をWindowsフォームで作っております。

    フォーム上にSystem.Timers.Timerを配置したいのですが、

    コンポーネント上にあるものはSystem.Forms.Timerです。

    コードで入力する際は、

    using System.Timers;

    を入力して

    Timerを入力したいのですが、FormsのTimerとあたるためエラーとなります。

    Timers.Timerをエラーが出ずに使用するにはVisualStudio上で設定するところがあるのでしょうか?

    2016年9月13日 5:24

回答

  • System.TimersとSystem.Formsに同じTimerクラスがあるため、Timerだけだとどちらのクラスなのかわからないので、Visual Studioは曖昧だとエラーを出します。曖昧さを排除するしかないので、原理的にVisual Studioの設定の問題ではありません。
    これを避けるには、
    System.Timers.Timerと明にTimerクラスを指定することになります。System.Timersが長いのであれば、エイリアスを用いて、例えば、
    using SysTimer = System.Timers;
    とすれば、
    SysTimer.Timerと書くことができるようになります。その他、静的メソッドでSystem.Timers.Timerのインスタンスを返すようにするなども考えられます。
    #追記
    他のたまたま同じ名前が存在していた場合にぶつからないように、最上位の名前空間(グローバル名前空間)として指定した、SysTimer::Timerの方が堅いです。

    #追記
    using SysTimer = System.Timers.Timer;
    とすれば、
    var timer = new SysTimer();
    などできます。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 編集済み trapemiyaModerator 2016年9月13日 5:58 表現をわかりやすく編集
    • 回答の候補に設定 星 睦美 2016年9月15日 4:13
    • 回答としてマーク 星 睦美 2016年10月20日 4:39
    2016年9月13日 5:41
    モデレータ
  • フォーム上にSystem.Timers.Timerを配置したいのですが、

    System.Timers.Timer や System.Threading.Timer はコンポーネントではないので貼り付けることはできません。
    どうしても使いたい場合は、コードエディター上で名前空間を厳密に指定するか、trapemiya さんが書かれているように using で別の名前を割り当てる必要があります。

    ところで、なぜ、System.Timers.Timer を使いたいのでしょうか?
    System.Windows.Forms.Timer 以外のタイマーは別スレッドでイベントが起きるなど、マルチスレッドを意識してコードを書く必要があります。
    難易度・複雑度が上がることになるわけですが、そのデメリットを受け入れてでもやりたいことが気にかかりました。
    (即座に Invoke するつもりなら、このタイマーを使うメリットはなくなるので…)

    • 回答の候補に設定 星 睦美 2016年9月15日 4:13
    • 回答としてマーク 星 睦美 2016年10月20日 4:39
    2016年9月13日 12:58
    モデレータ

すべての返信

  • System.TimersとSystem.Formsに同じTimerクラスがあるため、Timerだけだとどちらのクラスなのかわからないので、Visual Studioは曖昧だとエラーを出します。曖昧さを排除するしかないので、原理的にVisual Studioの設定の問題ではありません。
    これを避けるには、
    System.Timers.Timerと明にTimerクラスを指定することになります。System.Timersが長いのであれば、エイリアスを用いて、例えば、
    using SysTimer = System.Timers;
    とすれば、
    SysTimer.Timerと書くことができるようになります。その他、静的メソッドでSystem.Timers.Timerのインスタンスを返すようにするなども考えられます。
    #追記
    他のたまたま同じ名前が存在していた場合にぶつからないように、最上位の名前空間(グローバル名前空間)として指定した、SysTimer::Timerの方が堅いです。

    #追記
    using SysTimer = System.Timers.Timer;
    とすれば、
    var timer = new SysTimer();
    などできます。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 編集済み trapemiyaModerator 2016年9月13日 5:58 表現をわかりやすく編集
    • 回答の候補に設定 星 睦美 2016年9月15日 4:13
    • 回答としてマーク 星 睦美 2016年10月20日 4:39
    2016年9月13日 5:41
    モデレータ
  • フォーム上にSystem.Timers.Timerを配置したいのですが、

    System.Timers.Timer や System.Threading.Timer はコンポーネントではないので貼り付けることはできません。
    どうしても使いたい場合は、コードエディター上で名前空間を厳密に指定するか、trapemiya さんが書かれているように using で別の名前を割り当てる必要があります。

    ところで、なぜ、System.Timers.Timer を使いたいのでしょうか?
    System.Windows.Forms.Timer 以外のタイマーは別スレッドでイベントが起きるなど、マルチスレッドを意識してコードを書く必要があります。
    難易度・複雑度が上がることになるわけですが、そのデメリットを受け入れてでもやりたいことが気にかかりました。
    (即座に Invoke するつもりなら、このタイマーを使うメリットはなくなるので…)

    • 回答の候補に設定 星 睦美 2016年9月15日 4:13
    • 回答としてマーク 星 睦美 2016年10月20日 4:39
    2016年9月13日 12:58
    モデレータ