Visual-C#というものを初めて触っている者です。

フォーム上にボタン等のコントロールを配置して、ボタンをダブルクリックすると、イベントハンドラをユーザが記述するコード部分(partial class)が表示されてくるのですが(Form1.cs)、このpartial classの残りの、ユーザが編集する必要のないコードはForm1.Designer.cs内に自動生成されます。

このForm1.Designer.cs内に、たとえば

this.Button1.Click += new System.EventHandler( this.Button1_Click );  ←(1)

のようなコードが自動生成されているわけです。

ここで、Button1とはButtonクラスのオブジェクトであり、ClickとはButtonクラスの(Controlクラスから継承した)Clickイベントだということです。


http://msdn.microsoft.com/ja-jp/library/system.w …(VS.85).aspx

public event EventHandler Click  ←(2)


ここで使用されているEventHandlerとは何かというと、delegateです。

http://msdn.microsoft.com/ja-jp/library/system.e …

public delegate void EventHandler(Object sender, EventArgs e)  ←(3)



「イベントとは、コンピュータ・プログラムの実行に際し、何らかのアクションが発生した際にプログラムに発信される信号(これをメッセージと呼んだりする)をいう。」(『ウィキペディア(Wikipedia)』)


この「イベント」を、.NetFrameworkのクラスライブラリでは、(2)のように「EventHandler」という名前のデリゲートクラス型の変数として定義しているわけですが、(2)の中の「event」というキーワードの「意義」が分かりません。

Controlクラス定義内で(2)式のように、コントロールの「クリック」イベントを、「EventHandler」という名前のデリゲートクラス型の変数と定義するというのなら、それはそれで分かるのですが、なぜ更に「event」というキーワードを付ける必要があるのかが、よく分からないのです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> と書いた上での話なので、ClickイベントがButtonクラスのメンバであるという認識はいちおう持ってはいます。



ってことは,「メンバとは何か」の認識の問題でしょうか。

> 「の「イベント」を、.NetFrameworkのクラスライブラリでは、(2)のように「EventHandler」という名前のデリゲートクラス型のメンバ変数として定義しているわけですが、」
> と書いておくべきでした。

「変数」を「メンバ変数」と置き換えたところで,間違っていることに違いはありません。
メンバというのは,
・フィールド
・(配列型の場合,配列の)要素
・メソッド
・プロパティ
・イベント
です。イベントは独立のカテゴリです。
ref) ECMA-335 / 5 Terms and definitions


MSDNに資料が見つかったので断言してしまいますが,イベントとは,
ObserverパターンにおけるObserverインターフェイスをデリゲートで置き換えた物です。
Wikipediaの表現は気にせず,そういうものだと考えた方がよいと思います。

なお,こちらは資料が見つかっていないのですが,
デリゲートの定義は,そういうシグネチャを持つ型の定義だと認識した方がよいです。
デリゲートは確かにクラスですが,ほとんどの場合「メソッド型」だと考えた方がしっくりきます。
System.EventHandlerは,イベントハンドラで利用するメソッドの型を定義していると考えます。
C# 2.0からはイベントへの追加・削除時にデリゲート型をnewするコードを省略できるようになったので,
よりそちらの考え方をするとコードがよみやすくなります。

Button1.Click += Button1_Click; // C# 2.0からの省略表記

参考URL:http://msdn.microsoft.com/en-us/library/ms954621 …

この回答への補足

>メンバというのは,
>・フィールド
・・・
>・イベント
>です。イベントは独立のカテゴリです。

仰っている意味が分かりました。
私はフィールドとイベントをいっしょくたにして考えていました。
すいません。

補足日時:2009/05/25 16:50
    • good
    • 0
この回答へのお礼

http://msdn.microsoft.com/ja-jp/library/ms173118 …

「フィールドとは、クラスまたは構造体で直接宣言される任意の型の変数です。フィールドは、それを含んでいる型のメンバです。」

と書いてあるのですが、フィールドをメンバ変数と呼ぶのはまずいのでしょうか?

http://www.java2s.com/Tutorial/CSharp/0140__Clas …
にも、
7. 5. Member Variable
7. 5. 1. fields
とか書いてあるし、Member Variableの日本語訳は「メンバ変数」ではないのでしょうか?

>MSDNに資料が見つかったので断言してしまいますが,イベントとは,
>ObserverパターンにおけるObserverインターフェイスをデリゲートで置き換えた物です。

「Controlクラス定義内で(2)式のように、コントロールの「クリック」イベントを、「EventHandler」という名前のデリゲートクラス型の変数と定義するというのなら、それはそれで分かるのですが、」

と初めから書いてあります。

お礼日時:2009/05/25 16:34

eventはCLIのイベント機構を利用するためのキーワードです。



> この「イベント」を、.NetFrameworkのクラスライブラリでは、(2)のように「EventHandler」という名前のデリゲートクラス型の変数として定義しているわけですが、

違います。
EMCA-335 Common Language Infrastructure(CLI) 4th Editionの5 Temrs and definitionsに定義があります。
> event: A member that enables an object or class to provide notifications
イベントとは,あくまでメンバです。
さらに言うと,CLIの実行環境によって支援される,特殊なメソッドになります (8.11.4)。
# 個人的には,CLIによる簡易Observerパターン実装のサポートだと思っています。

そして,例えばSystem.Windows.Forms.Controls.Clickイベントのイベントハンドラの型がSystem.EventHandlerになります。

参考URL:http://www.ecma-international.org/publications/s …

この回答への補足

 #1さんの紹介サイトと#3さんのご意見に触発されて、抽象化された信号としての「イベント」と、クラスのメンバとしての『イベント』と、イベントハンドラが、.NET Framework上でどのような関係になっているのかいろいろと調べてみて、自分なりに整理してみましたところ、Observerパターンを実装する場合のIObserverインターフェイスやIObservableインターフェイスが、実体を持たない単なるインターフェイスに過ぎないのに対して、デリゲートとしての『イベント』は、コンピュータ上に明確な実体を持つオブジェクトであるという認識が得られました。

(デリゲートがオブジェクトであるという「知識」は初めから有りましたが、デリゲートもまた、他のオブジェクトと同様に、コンピュータのメモリ空間上に明確に存在し、他のオブジェクトとお互いにメッセージをやりとりしながら、生き生きと動いている存在であるというイメージが、頭の中に浮かび上がってきました。)



(1)クラスのメンバとしての『イベント』は、抽象化された信号としての「イベント」を受け取るためのデリゲート型オブジェクト(event receiver)である。

(1)名前空間Systemにおいて、EventHandlerクラス(デリゲートクラス)が次のように定義されている。

  public delegate void EventHandler( object sender, EventArgs e);

 このEventHandler型オブジェクトの役目は、オブジェクトsenderと、EventArgsオブジェクトeの二つを、同じシグネチャを持つ「イベントハンドラ」(処理ブロックの付いたメソッド)に、アーギュメントとして渡す事である。


(2)名前空間System.Windows.Formsにおいて、全てのコントロールの基底クラスとなるControlクラスが定義されており、そのメンバとして、"Click"という名称の『イベント』(これは、そのコントロールがクリックされたという「イベント」を受け取るための、event receiverとしての、インスタンス変数)が次のように宣言されている。

  public event EventHandler Click;


(3)ButtonクラスはControlクラスの派生クラスなので、メンバ『イベント』"Click"を継承する。
そこで、メンバ『イベント』"Click"に、Buttonオブジェクト button1 がクリックされたという「イベント」が起きたときに実行すべき処理を記述した「イベントハンドラ」(処理ブロックの付いたメソッド)の参照を登録することが出来る。

 this.button1.Click += new System.EventHandler( this.button1_Click );
 

(4)このようにすると、オブジェクトbutton1が持つ(has-a関係)デリゲート型メンバオブジェクト"button1.Click"は、そのオブジェクトがクリックされたという「イベント」が発生するのを監視する、UIベッタリでもSubjectベッタリでも無い、独立したObserverとして、その役目を果たすと考えることが出来る。

 IObserverインターフェイスおよびIObservableインターフェイスを実装する方式では、UI側でIObserverインターフェイスを実装し、Subject側でIObservableインターフェイスを実装する必要があるが、Eventモデルではメンバ『イベント』デリゲートの設計に集中すれば(まぁまぁ)良い。

 オブジェクトbutton1(event sender)においてオブジェクトがクリックされたという「イベント」が発生すると、オブジェクトbutton1(event sender)は、それがクリックされたという「イベント」を、メンバ『イベント』オブジェクト"button1.Click"(event receiver)に送信する。
(←この部分こそ、まさに、”イベントデリゲート呼び出しはクラス内部からのみ可能”の規則が絡んでくるところ)

「クリック・イベント」を受け取ったメンバオブジェクトClickは、(3)で登録されている「イベントハンドラ」(処理ブロックの付いたメソッド)

private void button1_Click( object sender, EventArgs e )
{
・・・
}

に、イベントが発生したオブジェクトと、発生したイベントの情報が格納されたEventArgs型オブジェクトの二つのオブジェクトをアーギュメントとして渡すことが出来、イベント処理が実行される。




 良いサイトを紹介してくれた#1さんと、忌憚のないご意見を頂いた#3さんに、感謝いたします。

補足日時:2009/05/26 13:53
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

「ここで、Button1とはButtonクラスのオブジェクトであり、ClickとはButtonクラスの(Controlクラスから継承した)Clickイベントだということです。」

と書いた上での話なので、ClickイベントがButtonクラスのメンバであるという認識はいちおう持ってはいます。


「の「イベント」を、.NetFrameworkのクラスライブラリでは、(2)のように「EventHandler」という名前のデリゲートクラス型の変数として定義しているわけですが、」



「の「イベント」を、.NetFrameworkのクラスライブラリでは、(2)のように「EventHandler」という名前のデリゲートクラス型のメンバ変数として定義しているわけですが、」

と書いておくべきでした。


>さらに言うと,CLIの実行環境によって支援される,特殊なメソッドになります (8.11.4)。

#1さんが紹介してくれたサイト内で、
「event は、デリゲートに対するプロパティのようなもの」
という解説があったので、何と言うか、いちおう、そういうプロパティ的な意味でのメソッドであるという認識はあります。

The CTS supports events in precisely the same way that it supports properties.

お礼日時:2009/05/25 07:24

> 本来イベントハンドラと呼ぶべきメソッド名をアーギュメントとして取り得る、


> 単なるデリゲート型クラスにしか思えないのですが。
「メソッド名」は文字列ではなく、メソッドそのものと思っていいよね?
(名がついてるとどうも文字列のことに思えてしまう)
あと、デリゲートonKeyDownのアーギュメントとは?
もしかしてこの部分のことなのかな?
> this.onKeyDown = onKeyDown;

デリゲートonKeyDownもイベントによって呼び出されるものではあるので
イベントハンドラの意味からするとおかしくない気もするけど、
C#では「イベント変数にイベントハンドラ(デリゲート)を追加する」みたいな
言い方をするので確かにちょっと違和感はあるかも。

気になるなら、ページ最下部に「お問い合わせ」があるので
そこから問い合わせてみてはどうでしょう。
    • good
    • 0
この回答へのお礼

再び回答いただきまして恐縮です。


>> 本来イベントハンドラと呼ぶべきメソッド名をアーギュメントとして取り得る、
>> 単なるデリゲート型クラスにしか思えないのですが。
>「メソッド名」は文字列ではなく、メソッドそのものと思っていいよね?
>(名がついてるとどうも文字列のことに思えてしまう)
>あと、デリゲートonKeyDownのアーギュメントとは?
>もしかしてこの部分のことなのかな?
>> this.onKeyDown = onKeyDown;



ここでのメソッド名とは、

this.Button1.Click += new System.EventHandler( this.Button1_Click );  ←(1)

において、デリゲートクラスであるEventHandlerが、具現化する際にアーギュメントとして用いているthis.Button1_Clickの内の、「Button1_Click」の部分に相当するものです。

もっとも、サイトのサンプルでは、KeyboadEventHandlerという名称のデリゲートクラス型(何でデリゲートクラス名としてEventHandlerなんていう、いかにもイベントハンドラと混同しやすい名前をわざわざ付けるのかも分からないんですが)を定義しているので、

delegate void KeyboadEventHandler(char eventCode);

KeyboadEventHandlerデリゲートクラス型のオブジェクト変数として宣言されたonKeyDownのアーギュメントは、メソッドじゃなくてchar型変数のeventCodeになるのですけど、

本来、イベントハンドラとは(1)のButton1_Clickメソッド(その実装はForm1.cs内でプログラマが行います)のような、きちんとした実体のあるメソッドのことを呼んでいるわけで、そのメソッドへの参照を含む存在+αに過ぎないデリゲートオブジェクトをイベントハンドラと呼ぶべきではないと思うわけです。


>気になるなら、ページ最下部に「お問い合わせ」があるので

気がつきませんでした。親切なサイトですね。問い合わせてみます。

お礼日時:2009/05/24 22:48

以下のページを読めば分かると思います。


(私が説明してもこれ以上のことは言えないので参考ページの提示だけ^^;)

イベント (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp_event.html

この回答への補足

いろいろ調べてみた結果、やはり、「イベントハンドラ」は、イベントデリゲートを介して呼び出されるメソッドであることが分かりました。


http://msdn.microsoft.com/ja-jp/library/17sde2xt …
更新 : 2007 年 11 月

”イベントは、アクションの発生を知らせるために、オブジェクトによって送信されるメッセージです。アクションは、ユーザーがマウスのクリックなどの対話的操作を行った場合や、なんらかのプログラム ロジックによってトリガされた場合などに発生します。イベントを発生させるオブジェクトをイベントの送信元(event sender)と呼びます。イベントをキャプチャし、そのイベ ントに応答するオブジェクトをイベントの受信側(event receiver)と呼びます。
イベント通信では、イベント送信元のクラスは、発生させたイベントをどのオブジェクトまたはメソッドが受信する (処理する) かについての情報を持っていません。そこで、送信元と受信元との間を仲介するもの (つまりポインタ的な機構) が必要になります。.NET Framework では、関数ポインタの機能を提供する特別な型 (Delegate) が定義されています。
デリゲートは、メソッドへの参照を保持できるクラスです。他のクラスとは違って、デリゲートクラスはシグネチャを持ち、このシグネチャに一致するメソッドへの参照だけを保持できます。これにより、デリゲートはタイプセーフな関数ポインタやコールバックと同等の機能を持つことができます。デリゲートにはさまざまな用途がありますが、ここではデリゲートのイベント処理機能について説明します。デリゲート クラスは、宣言すると、定義は不要です。デリゲート宣言によってデリゲートのシグネチャが与えられ、共通言語ランタイムによって実装が提供されます。次の例は、イベント デリゲート宣言です。
規約により、.NET Framework のイベント デリゲートは、そのイベントの発生元と、そのイベントのデータという 2 つのパラメータを持ちます。
カスタム イベント デリゲートは、イベントがイベントデータを生成する場合にだけ必要です。マウスのクリックなどのユーザーインターフェイス イベントの一部を含め、多くのイベントはイベントデータを生成しません。イベントがデータを生成しない場合には、データなしイベント用のクラスライブラリに用意されているイベントデリゲートの System..::.EventHandler が適しています。その宣言を次に示します。
イベント デリゲートはマルチキャストなので、複数のイベント処理メソッドへの参照を保持できます。詳細については、「Delegate」を参照してください。デリゲートでは、イベント処理を柔軟に、そして詳細に制御できます。デリゲートは、イベントに対して登録されている

「イベントハンドラ」のリスト

を管理することで、そのイベントを発生させるクラスのイベントディスパッチャとして動作します。”

補足日時:2009/05/25 21:44
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お陰でeventキーワードの意義は理解できたのですが、サイト内でイベントとイベントハンドラが混同されているように思えてなりません。


KeyboardEvendHander onKeyDown;

「このようにしてイベント待受け部から独立させたイベント処理部(この例においては onKeyDown デリゲート)のことをイベントハンドラと呼びます。」

これって、正しいんでしょうか?

私には、本来イベントハンドラと呼ぶべきメソッド名をアーギュメントとして取り得る、単なるデリゲート型クラスにしか思えないのですが。
或いはむしろ、「イベントレシーバー」と呼ぶべきものではないのでしょうか?

お礼日時:2009/05/24 20:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q平将門とガマガエルの関係

東京の神田明神にある平将門の首塚にはガマガエルの置物が
置かれているそうですね。
平将門とガマガエルにはどんな関係があるのでしょうか。

Aベストアンサー

将門殿の三女「五月(楓)姫=如蔵尼(にょぞうに)」が父の復讐を果たさんがため
祈願し、妖術を得て「瀧滝夜叉」と改名し蝦蟇(ガマ)となったとされる

だそうです。
詳しくは以下を。

http://blog.livedoor.jp/ayabeda/archives/51342673.html

Q言語[C#、Java]..クラスの扱い方の違い[ファイル名とpublicなクラス名について]

C#とJavaでのクラスの扱い方の違うであろうことに困惑しています。

Javaの場合では、publicなクラス名とJavaファイル名(クラスのファイル名)を一致させる。というのがきまり事だったかと思います。

ですが、

C#の場合では、publicなクラス名とクラスファイル名を一致させなくても動作しています。

C#でのクラス名とクラスファイル名のしばりは何もないのでしょうか?

ご存知の方、助言宜しくお願い致します。

Aベストアンサー

がると申します。
どちらかというと、Javaのように「ファイル名とclass名との間に縛りがある」言語のほうが珍しいと思うので。
記憶しているかぎりでは、C#は「自由に」ファイル名をつけられた記憶があります。

Q平将門の直系子孫について

平将門の直系子孫(将門の弟の子孫も含む)っているんでしょうか。

あんな華々しい活躍をして子孫全滅は悲しいです。
貞盛の子孫は一応、栄えたのに・・・

Aベストアンサー

相馬家がそうだと思います。
下記、氏祖に相馬将門とありますが、これが平将門だと思います。

参考URL:http://www.tanutanu.net/roots/database/s/souma1.htm

Qオブジェクト指向における「クラスA have a クラスB」の関係において,クラスBからクラスAのあるメンバ変数だけを触る方法

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(プロパティ)usedClassAとする.

=======
C言語風に書くと,
<code>
public void クラスA{
  クラスB usingClassB = new クラスB(); // 持っているクラスB
  int commonNum = 0;
  public void AddCommonNum(){
      commonNum++;
   }
   ...
   (その他の処理)
   ...
}

public void クラスB{
   class usedClassA;    // 持ち主のクラスA

   // コンストラクタ
   public クラスB(クラスA _usedClassA){
       usedClassA = _usedClassA;
   }
   public void AddCommonNum(){
       _usedClassA.AddCommonNum();
   }
}
<\code>
となります.

この方法の問題点は,クラスAとクラスBに<双方向の依存関係を作っている>ことで,
クラスAの設計(ここではAddCommonNum())が変更されたときに,クラスBの内容を変更しなければならない可能性があることから,拡張性に欠けると考えています.

そこで,他に何かいい実装方法が無いか,
教えていただけないでしょうか?
特に,このような前提条件に汎用的に使える方法だと尚良いです.

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(...続きを読む

Aベストアンサー

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __TP variant;

  explicit CVariantHolder(const variant& val) : m_val(val){}
  ~CVariantHolder(){}

  variant& Get(){ return m_val; }
  const variant& Get() const { return m_val; }
  operator variant&(){ return m_val; }
  operator const variant&() const { return m_val; }
private:
  variant m_val;
};

struct CPropertyData
{
  typedef std::map<std::string, IVariantHolder*> map_t;
  template<class __TP>
  bool AddProperty(const __TP& tp, const std::string& sPropertyName)
  {
    if(GetProperty(sPropertyName))return false;
    return m_map.insert(std::make_pair(sPropertyName, new CVariantHolder<__TP>(tp))).second;
  }
  IVariantHolder* GetProperty(const std::string& sPropertyName)
  {
    return const_cast<IVariantHolder*>(
                static_cast<const CPropertyData&>(*this).GetProperty(sPropertyName)
                     );
  }
  const IVariantHolder* GetProperty(const std::string& sPropertyName) const
  {
    map_t::const_iterator it = m_map.find(sPropertyName);
    return it == m_map.end() ? 0 : it->second;
  }
private:
  map_t m_map;
};

template<class __TP>
static __TP* Lock(CPropertyData* property, const std::string& sPropertyName)
{
  CVariantHolder<__TP>* pVal = dynamic_cast<CVariantHolder<__TP>*>(property->GetProperty(sPropertyName));
  return pVal ? &pVal->Get() : 0;
}
//プロパティオブジェクトココまで

//テスト用の構造体
struct CommonStruct
{
  CommonStruct(long _l, short _s, char _c) : l(_l), s(_s), c(_c){}
  longl;
  shorts;
  charc;
};

//クラスAとクラスBココから
struct ClassB;
struct ClassA
{
  ClassA(ClassB* p, CPropertyData* property) : m_useClassB(p), m_property(property)
  {
    //ココでメンバ変数(プロパティ)の領域を動的に作成する
    m_property->AddProperty(int(0), "commonNum");
    m_property->AddProperty(CommonStruct(4, 2, 1), "commonStruct");
  }
  void DisplayProperty()
  {
    ::printf("%s %d %s\n", "[commonNum : ", *::Lock<int>(m_property, "commonNum"), "]");

    CommonStruct* p = ::Lock<CommonStruct>(m_property, "commonStruct");
    ::printf("%s <%d><%d><%d> %s\n", "[commonStruct <l><s><c> : ", p->l, p->s, p->c, "]");
  }
private:
  ClassB*m_useClassB;
  CPropertyData*m_property;
};

struct ClassB
{
  explicit ClassB(CPropertyData* property) : m_property(property){}
  void AddCommonNum()
  {
    int* pi = ::Lock<int>(m_property, "commonNum");
    (*pi)++;
  }
  void SetCommonStruct(long l, short s, char c)
  {
    CommonStruct* pc = ::Lock<CommonStruct>(m_property, "commonStruct");
    new (pc) CommonStruct(l, s, c);
  }
private:
  CPropertyData*m_property;
};
//クラスAとクラスBココまで

//お試し
int main()
{
  //両方に共通なプロパティオブジェクト
  CPropertyData property;

  //クラスBに渡す
  ClassB b(&property);

  //クラスAにクラスBとプロパティオブジェクトを渡す
  ClassA a(&b, &property);

  //クラスBでプロパティを操作する
  b.AddCommonNum();
  b.SetCommonStruct(10, 20, 30);

  //クラスAでプロパティを表示する
  a.DisplayProperty();
  return 0;
}

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __T...続きを読む

Q平将門は何男?

平将門は通称を相馬小次郎とか滝口小次郎といったそうですが
小次郎って次男につける名前のような気がします。
なんとなく、長男だろうと思っていたのですが
実際には将門は何男なのでしょうか?

Aベストアンサー

http://www.ippusai.com/hp_home/bandoh/bandoh02.htm
http://www.ippusai.com/hp_home/bandoh/bandoh.htm

平将門さんのファンサイトであろう「一風斎の坂東風土記」さんのサイトです。参考になりますでしょうか?

この中には三男であったと書かれています。
ただ、URLにもあるとおり、生誕年ははっきりとしてないので三男坊だったであろうということです。

参考URL:http://www.ippusai.com/hp_home/bandoh/bandoh02.htm

QMSDNのようなCDケースを探しています。

質問するカテゴリが分からなかったのでここに投稿しました。

CDの収納ケースを探しています。

条件としては、
・上下にCDが収納できるサイズ。(見開きで4枚)
・CDの並び替えを行う事が多いので2穴リングファイル式。(必須)
・本の様に開くのではなくチャックなどで口が閉まるとよい。(必須ではない)

理想としてはMSDNから送られてくるCDケースみたいな奴が欲しいのです。
⇒現在のケースではなくて2000年度版までの奴。
 わかりますでしょうか?

サンワサプライで以下の商品を見つけたのですが、
収録枚数が少なく別のものを探しています。(96枚ぐらいがベスト)
http://www.sanwasupply.co.jp/product/syohin.asp?code=FF-CD40&cate=3
http://www.sanwasupply.co.jp/product/syohin.asp?code=FCD-PY12BK&cate=3

MSDNでCDケースだけとか注文できないですかねぇ?
又、皆さんはCDをどんな方法で収納していますか?

質問するカテゴリが分からなかったのでここに投稿しました。

CDの収納ケースを探しています。

条件としては、
・上下にCDが収納できるサイズ。(見開きで4枚)
・CDの並び替えを行う事が多いので2穴リングファイル式。(必須)
・本の様に開くのではなくチャックなどで口が閉まるとよい。(必須ではない)

理想としてはMSDNから送られてくるCDケースみたいな奴が欲しいのです。
⇒現在のケースではなくて2000年度版までの奴。
 わかりますでしょうか?

サンワサプライで以下の商品を見つけたのですが、...続きを読む

Aベストアンサー

MSDNの新しいフォルダは差し替えは楽ですが、今ひとつですね。
コクヨやキングジムなどのカタログに2穴のバインダ用のCD用のフォルダがあります。
文具屋さんにある分厚いカタログを見せてもらってください。また、アスクルやカウネットなどの通販カタログにもありますよ。

Q東京の平将門の北斗七星について教えてください。

平将門に関して、東京23区内にある平将門ゆかりの寺社の配置が北斗七星を構成し、 天海による呪的魔方陣ではないかと言われているそうです。
それで、実際の北斗七星は、そのβ星とα星とを結んで、その間隔を、柄杓の底から縁に向かって約5倍伸ばすと北極星があります。東京の平将門の北斗七星について、同じようにαにあたる鳥越神社とβにあたる兜神社の距離を延ばした北極星に当たる位置に、何かあるでしょうか。

よろしくお願いします。

Aベストアンサー

私も以前、この話を聞いて調べましたが、足立区栗島という普通の町に至るだけです。
ってゆうか、そもそも東京には他にも将門公縁の神社は多くあり、その中から北斗七星になるように選んで結んだだけです。つまり根拠があって配置したのではない。
さらに言えば、その幾つかの神社も何度か移動されているので、今のような関係にはなりません。

おっしゃるとおり、北斗信仰で大切なのは天帝である北極星であり、北斗七星はその家臣でしかありません。
ですから、将門公縁の神社が北斗七星を結んでいたとしても、それだけの事なんですよ。

Qpublic_html の中に出来たThumbs.db って?

普段FFFTPソフトを使ってHPをアップロード等しています。
先程アップロードしようとしたら、ローカル側に
Thumbs.db というファイルが出来ていました。
ローカル側はPCの\Dに作成した、public_html フォルダの中身が羅列するもので、自分の知らないファイルが自然に作成されているのが不思議です。
\Dドライブのpublic_html フォルダを確認しましたが、そのようなファイルはありませんでした。
それが何なのか分かる方いらっしゃいますか?

Aベストアンサー

Thumbs.db の正体(Thumbnail)と対処法はもう書かれてますので書きませんが、私もFTPでまとめてアップする時にはたまに間違えて送ってしまいます(笑)。場合によってはかなり大きくて困ったもんですよね。まあ転送中見てればキャンセルすればいいんですが。

FFFTPなら表示されますので(それで気づかれたんですよね?)、面倒ですがそこで削除するか、それだけ転送しない方法対処するか、次の設定で送信されなくなりますので、ご参考までに。(ただし、フォルダの中身をそっくりそのまま、一括して転送(ミラーリング)する場合にのみ有効です)

1.FFFTPでメニューバーから「オプション」を選択
2.「環境設定」をクリック
3.「ミラーリング」タブをクリック
4.「転送しないファイル名」の「追加」をクリック
5.「Thumb.db」を入力
6.アップロードする場合は、「ミラーリングアップロード」ボタンをクリック

これでThumb.dbが存在しても、それだけは転送されません。

ただし、ミラーリングですので、ホストのディレクトリ内はローカルのフォルダ内と同じにしてしまうため、一致しないファイルは削除されてしまいますのでご注意を(ミラーリングアップロードボタンをクリック後、処理内容表示ボタンを押せば確認画面になります。また削除しないファイルの指定も可能です)。

試験用のフォルダとディレクトリを作って試されることをおすすめします。

以上、本質門とは関係ないかもしれませんが、ご参考までに。

Thumbs.db の正体(Thumbnail)と対処法はもう書かれてますので書きませんが、私もFTPでまとめてアップする時にはたまに間違えて送ってしまいます(笑)。場合によってはかなり大きくて困ったもんですよね。まあ転送中見てればキャンセルすればいいんですが。

FFFTPなら表示されますので(それで気づかれたんですよね?)、面倒ですがそこで削除するか、それだけ転送しない方法対処するか、次の設定で送信されなくなりますので、ご参考までに。(ただし、フォルダの中身をそっくりそのまま、一括して転送(ミラ...続きを読む

Q平将門と藤原純友は呼応して乱を起こしたのか

 平将門と藤原純友は呼応して乱を起こしたのでしょうか。
 それとも、全くそんなことはなく、お互いに知り合いでもなかったのでしょうか。

Aベストアンサー

乱がほぼ同時期に起こり東の将門、西の純友の間に密約があり、東西海陸から京都に攻め入るという噂が京都で広まりついには比叡山で両者が密会していたという伝説が生まれました。内容は将門、純友が京都にいたとき比叡山中腹で密会し”将門は天皇の五世孫のだから皇位に就き純友は藤氏の出だから摂関の地位に就く”と固く約束したということです。今も比叡山中腹に転がっている岩のそばまで来ると観光バスのガイドがこの伝説を語りこの岩こそが二人が陰謀をめぐらしたときに足をかけた岩ですと解説があるそうです。
二人は同時期に京都にいたようですが呼応して乱を起こした事はなかったようです。

Qdelegateの配列

下記のプログラムのように、number個のタスクがあるとき、parallel個のCPUを使って並列計算したいのですが、以下のプログラムではうまくいきませんでした。
Invokeで実行した後に, actions[i]()が、一時変数のはずのiにアクセスしてしまい、IndexOutOfRangeExceptionが投げられてしまいます。

int parallel = 2;
int number = 100;
var data = new List<List<int>>();
Action[] actions = new Action[parallel];
for (int i = 0; i < parallel; i++) {
data.Add(new List<int>());
actions[i] = () => {
for (int b = i; b <= number; b += parallel)
data[i].Add(b*b);
};
}
Parallel.Invoke(actions);

原因はactions[i]の初期化にあるはずで、以下のコードの差し替えるとうまくいきます。

actions[0] = () => {
for (int b = 0; b <= number; b += parallel)
data[0].Add(b*b);
};
actions[1] = () => {
for (int b = 1; b <= number; b += parallel)
data[1].Add(b*b);
};

しかし、たとえばparallel=4などとするといちいちactionsを初期化するのは面倒ですし、処理内容を変えようとすると、4か所すべてを変更しなければならず、ミスを誘発します。
どうすればよいでしょうか。C#に詳しい方、教えてください。

下記のプログラムのように、number個のタスクがあるとき、parallel個のCPUを使って並列計算したいのですが、以下のプログラムではうまくいきませんでした。
Invokeで実行した後に, actions[i]()が、一時変数のはずのiにアクセスしてしまい、IndexOutOfRangeExceptionが投げられてしまいます。

int parallel = 2;
int number = 100;
var data = new List<List<int>>();
Action[] actions = new Action[parallel];
for (int i = 0; i < parallel; i++) {
data.Add(new List<int>());
actions[i] = () => {
for (int...続きを読む

Aベストアンサー

キャプチャの範囲の問題です。
actions[i]に代入されるラムダ式は,「i」をキャプチャします。
# iの値ではないことに注意。
結果として,ループを抜けたときに,iの値はparallelに等しくなります。

値をキャプチャすることはできませんが,forスコープ中で新たに変数を導入することで,
作ったときのiの値を使うことができます。
for (int i = 0; i < parallel; i++) {
 var j = i; // iの値を取得する。
 data.Add(new List<int>());
 actions[j] = () => {
  for (int b = j; b <= number; b += parallel)
   data[j].Add(b*b);
 };
}


人気Q&Aランキング