c#デリゲート関連の命名について

このQ&Aのポイント
  • c#デリゲート関連の命名についての質問です。SampleDelegateとSampleActionにはどのような名前をつければいいのか悩んでいます。
  • SampleDelegateは値を取得するメソッドを表すので、'~すること'を表す動名詞を使用するのが適切です。SampleActionも同様に、値を取得することを表す名前にするとよいでしょう。
  • 例えばSampleDelegateは'GetValue'、SampleActionは'ValueGetter'という名前を使うことができます。しかし、最終的な命名はコードの読みやすさや一貫性を保つことが重要です。
回答を見る
  • ベストアンサー

c# デリゲート関連の命名について

 こんにちは。c#初心者です。  今回はデリゲート関連の命名についての質問です。 // ――――――――――――――――――――――――――――――― // 簡素化のため、フィールド変数のまま書いています public delegate int SampleDelegate(); public SampleDelegate SampleAction; public int Value {   get { return SampleAction(); } } // ―――――――――――――――――――――――――――――――  上記のようなコードを書いているのですが、「SampleDelegate」に当たる部分、「SampleAction」にあたる部分にはどのような名前をつければいいのかと迷っています。  SampleDelegateは値を取得するメソッドを表すので「GettingValue」や、「ValueGetter」がいいのか、それとも「ValuePasser」みたいなのがいいのか、それ以外がいいのか、  SampleActionも「ValueGetter」がいいのかそれとも、メソッドと同じように「GetValue」にするのがいいのかそれ以外がいいのかと悩んでいます。  最初は「SampleDelegate」が「GettingValue」、「SampleAction」が「ValueGetter」になっているのですが、反対の方がいいような気がしたり、その他いろいろで困っています。  どなたか詳しい方いらっしゃいましたら教えていただけませんか? できれば「『SampleAction』は動作自体だからGettingValueのように『~すること』 のように動名詞を使い方がいい」のように他の命名においても応用が利く教え方にしていただけるとありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.27

>結局、setとAddは結局同じ動作を含んでいたことに気づいて~ >何もデリゲートを使わなくてもやりたかったことの一部が出来たんです。 はい、そういう事ですね。 >_sampleAction( ←ここまで入れるとツールチップで変数名が表示されるので 或いはカーソルをかざしたりしても出てきますね。 こういうのをひっくるめてインテリセンス(Intellisense)というんですが VC++2008ではこいつがC#に比べてかなり貧弱なんですよw ずっと前にVC++で同じようなことしようと試みた事があるんですが、結局その時は どうあがいても、カーソルをかざすのか、キー入力だったかの、どっちか片方だけしか反映できないという結果だったように思いました。 (まぁ、「貧弱」というのはそれだけの理由では決してありませんが) 次のバージョンでは強化されたと小耳にはさんだので(もうさらにその次が既に触れられるのかな?)幾分期待はしていますが。 ・<>について たぶん見つかりました。 コレっぽい感じではないですか? http://d.hatena.ne.jp/saiya_moebius/20090129/1233243475 html上でのあれとおんなじみたいですね &lt; と &gt; 使えば出来るっぽい感じです List<T> ↓ List&lt;T&gt; で、リンク先の方はこれだと書いてる側は分かり辛いってんで {}をかわりに使ってらっしゃる提案をされてますが それから、<include>使って別ファイルに置き変え出来るっぽいですね http://msdn.microsoft.com/ja-jp/library/9h8dy30z.aspx これを使えば、日英別々にxml作っといて、後で簡単に切り替えるといったことが出来るかもしれません。 私のとこでは dllにビルドしといて 別のC#アセンブリから 参照設定して(xmlファイルも運んどいて)呼び出したら 表示出来ました が 自分自身のアセンブリのとこに /// <include file='xml_include_tag.doc' path='MyDocs/MyMembers[@name="test"]/*' /> とかをやっただけでは出ず。 うーむ これが自分のとこでも反応してくれれば最強なんですが これは出来ないのかな?

koumei000
質問者

お礼

 ありがとうございます。おかげさまで大助かりです。  インテリセンスってオートコンプリートの事だけかと思っていました。あのツールチップもそうだったのですね。c#に慣れてきてたころに一度VC2010Expressに挑戦してみたのですが、「this->」の時点で意味が分からなくなった上、全然インテリセンスが表示されないのでいったん諦めて、しばらくはc#一本に絞ることにした覚えがあります。  「<include>」、覚えておきます。  初心者の長い質問に付き合ってくださって、ありがとうございました。

その他の回答 (26)

回答No.16

すみません public ItemGettingCallback ItemGetter { get { return _itemGetter; } protected set { ItemGetter = value; } } ↓ public ItemGettingCallback ItemGetter { get { return _itemGetter; } protected set { _itemGetter = value; } } です。

回答No.15

>現在リファクタリングですが、なにせ多岐にわたって「protectedフィールド」を作ってしまったものですから根幹部分のクラスから修正中で、CList系には手を付けられていません。 >今回のものに関してはつい癖で「protected」としてしまっただけで、継承先ではまだ使用していません。 >可能性が十分にあるものとしています。 なるほど、そう言う状況ですか 命名を考えるにあたっては 十分に構造を把握しないといけないので (不要なメンバがある場合は前提が変わってくるなど) もうちょい確認させてください。 では、まず単純にこれらのフィールドをprivateにして置き private ItemGettingCallback _itemGetter; public ItemGettingCallback ItemGetter { get; set; } このパターンがもしベストなのであれば この_itemGetterが変更されるというのは ItemGetterのsetで行われることとする という風になると思われますが もしこの部分が継承先からしか変更されないとかなら、 public ItemGettingCallback ItemGetter { get { return _itemGetter; } protected set { ItemGetter = value; } } こんな風にもできますね(アクセス修飾子は可能な限り強力なものを優先できる構造にすると、後で修正や拡張が楽です。) もう少し このItemGettingCallback などのデリゲートですが これが「見えないといけない範囲」ってpublicじゃないといけませんか? これらのコードから類推すると 最終的に、外部からはT(ジェネリック)1個だけ指定すればOKそうな気もしなくもないんですが

koumei000
質問者

お礼

 解答ありがとうございます。 > これが「見えないといけない範囲」ってpublicじゃないといけませんか?  CListActionBox<T>はその名前の通り本当に単なる入れ物でそのクラス内でnull対策などの適正化以外の処理は行われません。  使い方は // ------------------------------------------------- private CListActionBox<int> _itemActions; public CList<int> SampleItems { get { return _sampleItems; } } // ------------------------------------------------- などのようにして、クラス外部からでも、そのインスタンスを定義した場所と密接にかかわる部分で「CList」の「get」「set」を初めとする処理の変更を可能にするものです。そのため「protected set」にはできないと思います。 > このItemGettingCallbackなどのデリゲートですがこれが「見えないといけない範囲」ってpublicじゃないといけませんか?  上記のように用いるため「public」にしないとアクセシビリティのエラーが発生します。

回答No.14

あー、意味分かんない箇所がw 正しくは CListActionBox<T>クラスか派生クラス CList<T>クラスの派生クラス ↓ CListActionBox<T>クラスの派生クラスか CList<T>クラスの派生クラス ですw

回答No.13

むむ? CListActionBox<T>クラスの protected ItemGettingCallback _itemGetter; protected ItemSettingCallback _itemSetter; public class CList<T>クラスの protected readonly CListActionBox _actionBox; はフィールドですよね。 public ItemGettingCallback ItemGetter { get; set; } ↑こういうのがプロパティ フィールドがprotectedな場合は、下記の通り「_」ではじめるとCLS準拠じゃない 及び #7の >パブリック フィールドとプロテクト フィールドは適切にバージョン管理されず に引っかかってしまう恐れがあるので こいつらはprivateにしないとまずいかもしれません。 protectedでないといけない理由があるとしたらそれは「確実に派生クラスのコードに存在する」と思うので、 CListActionBox<T>クラスか派生クラス CList<T>クラスの派生クラス を、一つでも見せていただくことは可能ですか?(_itemGetterや_itemSetterや_actionBoxを使っている部分で良いです) また _itemGetter; _itemSetter; はreadonlyではないですが これは変更可能性がありますか?

koumei000
質問者

お礼

> パブリック フィールドとプロテクト フィールドは適切にバージョン管理されずに引っかかってしまう恐れがあるのでこいつらはprivateにしないとまずいかもしれません。  現在リファクタリングですが、なにせ多岐にわたって「protectedフィールド」を作ってしまったものですから根幹部分のクラスから修正中で、CList系には手を付けられていません。 > protectedでないといけない理由があるとしたらそれは「確実に派生クラスのコードに存在する」と思うので、  今回のものに関してはつい癖で「protected」としてしまっただけで、継承先ではまだ使用していません。 > これは変更可能性がありますか?  可能性が十分にあるものとしています。

回答No.12

ここでいうCLSはCommon Language Specificationのことですね ここに概要が集約されてるように思います。 言語間の相互運用性 http://msdn.microsoft.com/ja-jp/library/730f1wy3%28v=vs.80%29.aspx >どのようなプログラミング言語を使用しているコードからでも確実に利用できるマネージ コードを作成できるように、共通言語仕様 (CLS: Common Language Specification) と呼ばれる、各種の言語を利用する場合に必要とされる言語機能や規則のセットが定義されています。 つまり、Visual BasicからだろうがC#からだろうがC++/CLIからだろうが その他の、マネージコードをサポートする言語だろうが CLS準拠になっていれば 正式にサポートされてる、どの言語からでも使えるようなマネージコードのdllになる、ということです。(もしかしたら実際のところは不完全かもしれませんが、概念的には少なくともそう書いてあります) koumei000さんの過去質問をいくらか拝見させていただきましたが パフォーマンスを気にしてらっしゃる回もありましたね。 パフォーマンスを本当に求めたいなら 現状では、やはりネイティブなCやC++がだいぶ勝る場合が多いです。 で、C#からネイティブC++のdllを呼び出すとかも、可能は可能ですが、色々と不自由が付きまといます。 そこで、C++/CLIを橋渡しとして使う、といった手法があったりします。 C#側がメインでそこからC++/CLIを少し使う、といったことは現状でもできるでしょうが もし今作ってるC#のクラスライブラリがCLS準拠になってれば C++/CLIをメインにして、そっからC#のライブラリを安心して使う という手もその時自由に選択できるようになる、ということのはずです。 >ということは継承先で触る必要性のあるものに関しては「protected」プロパティにすれば良いということでしょうか? はい、それで良いはずです。 ・コードについて とりあえず、ここまで書いて投稿しようとして その前に 別タブで確認して、お礼いただいたことに気付いたのですが 上記の内容が伝わるのは早い方が良いと思うので この回答は先に載せておきます 内容は今から確認しようと思うので ちょっと待ってくださいね。

koumei000
質問者

お礼

 早速の解答ありがとうございます。 > どのようなプログラミング言語を使用しているコードからでも確実に利用できるマネージ コードを作成できるように、共通言語仕様 (CLS: Common Language Specification) と呼ばれる、各種の言語を利用する場合に必要とされる言語機能や規則のセットが定義されています。  お恥ずかしいことにCLSをプログラミング言語の一種と勘違いしていました。勉強になります。 > パフォーマンスを本当に求めたいなら  確かにパフォーマンスは求めていますが、とりあえず、C++よりC#の方が簡単なので多言語への挑戦はC#でそこそこなってからにしておきます。

回答No.11

>Yune-Kichiさん 確かに見返してみると 今回の要件では、あるいはCLS準拠の必要はないかもしれませんが このクラスライブラリがもし多言語から使われるなどなどといったことが今後想定される得るのであれば 準拠しておけるなら準拠しておいた方が確実、ですよね。 >CLS違反であるuintなどを使ってもprivateであればCLSCompliant(true)なクラスだったりします。 内部的に関数切り分けして、その部分は外には公開しないとかなら そこだけinternalにすればprivateまでいかなくてもOKですし (ていうか、CLS 準拠が関係する部分じゃないなら、もともとメソッドや型の命名規則とかもそんなに拘らなくてもいいんじゃないかなと。) CLS 準拠コードの記述 http://msdn.microsoft.com/ja-jp/library/bhc3fa7f%28v=vs.80%29.aspx それ以外については、やはりそうですね。 ここまでの内容を含めて、尚且つもう一歩進んだ命名法を考える というためには、とりあえずは 現状の継承構造とか、デリゲートになってる _sampleBox.SampleAction(); とか SampleBox とかの内容を見てみたいですね。

koumei000
質問者

お礼

 ご意見ありがとうございます。  思い返してみれば、継承時の高速化に拘りすぎて、あちこち「protected」だらけでむしろ「private」なんて構造体以外では見かけない状態でした。 >SampleBoxとかの内容を見てみたいですね。  とりあえず現段階での状態はこんな感じです。 // ---------------------------------------------- // これが「SampleBox」 // <summary> //   Cは「Controled」の略。…</summary> public class CListActionBox<T> { // 実はこれが例の「SampleDelegate」。戻り値はTで、引数あり public delegate T ItemGettingCallback(int index); // ↓の二つが「SampleAction」 protected ItemGettingCallback _itemGetter; // 省略。setアクセサでは「value」が「null」時に既定動作の代入あり public ItemGettingCallback ItemGetter { get; set; } // set用もあったりする public delegate void ItemSettingCallback(int index, T item); protected ItemSettingCallback _itemSetter; // 省略。setアクセサでは「value」が「null」時の既定動作の代入あり public ItemSettingCallback ItemSetter { get; set; } // コンストラクタは省略 } // - - - - - - - - - - - - - - - - - - - - - - - - - /// <summary> ///   Cは「Controled」の略。…</summary> public class CList<T> { protected readonly CListActionBox _actionBox; // ここが「public int Value」だった部分 public T this[int index] { get { return _actionBox.ItemGetter(index); } set { _actionBox.ItemSetter(index, value); } } // コンストラクタに「CListActionBox」の引数あり // その他は省略 } // ----------------------------------------------  こんな感じで至る所に「protectedフィールド」があります(省略した部分にも山ほど)。また、「CList<T>」は public CList<int> SampleItems { get { return _sampleItems; } }  こんな感じで1クラスに複数使う予定です。  速度は計算量の問題なのは分かっていますが、一度プロパティとフィールド変数の速度の差を測定してしまってから至る所に「protectedフィールド」を使うようになってしまいました。  これらは「protectedプロパティ」に置き換えれば片付く問題なのでしょうか?

回答No.10

MSのデバッグ用のリファレンスコードでも,_から始まるフィールドは使われています。 Reflectorで誤ってSystem.dllを見てしまったことがありますが,_から始まるフィールドがありました。 privateフィールドに関しては,_から始めて問題ないと思います。 元々,_から始まる識別子はC#に関してそれ自体は文法違反等ではないです。 CLSは別物ですし,CLS違反であるuintなどを使ってもprivateであればCLSCompliant(true)なクラスだったりします。 protectedフィールドに関しては,「それを定義したクラスが与り知らぬ場所で変更される」という点で,publicフィールドやグローバル変数と同じ問題があります。 それ故に,protectedフィールドは勧められません。 # MSDNの書き方はどうかと思いますが…… また,その理由から,constやreadonlyの修飾のなされたprotectedフィールドであれば同様のpublicフィールドと同じく,使用しても問題ないと思います。

koumei000
質問者

お礼

 解答ありがとうございます。  CLSってコマンドプロンプトの類ですよね?(間違っていたらすみません)たしかに、大文字と小文字の区別が無かったと思います。CLSに使うかどうか不明ですが、今後の役に立つと思います。 > protectedフィールドに関しては,「それを定義したクラスが与り知らぬ場所で変更される」という点で,publicフィールドやグローバル変数と同じ問題があります。それ故に,protectedフィールドは勧められません。  ということは継承先で触る必要性のあるものに関しては「protected」プロパティにすれば良いということでしょうか?

回答No.9

あ、これかな http://msdn.microsoft.com/ja-jp/library/x8ak87y5.aspx C#なら、フィールドの名前について private以外だとダメで privateならOK、っぽいですね。 どの道privateにしなきゃいけないってことなので、それを守る限りにおいて問題はない、が正解のようですね。

koumei000
質問者

お礼

 やっぱりprivateにしなければならないのですね。いろいろと勉強になりました。ありがとうございます。

回答No.8

一応確認してみました(C++) namespace だ、だめですよぅ{ struct AAAA { int _inline; }; int BBBB(int _fastcall){ return _fastcall; } } う~んw これに関しては、VC++2008で両方ダメでした。namespaceなくしてCでコンパイルしても通らない… まぁこれらは、青色になっちゃいますし、明らかに「こんなん書こうと思うなんて」あり得ないとはおもいますがw まぁでも、サンプルも結構あることだし C#のprivateなフィールドで 「_+小文字スタート」は、「大抵は大丈夫」なのかなぁ

koumei000
質問者

お礼

 わざわざ確認してくださってありがとうございます。C++に移行する際の参考にさせてもらいます。

回答No.7

>「__」および「_+大文字」で始まる識別子は~たぶんこの辺は C# でも同じなんじゃないでしょうか. あ~! なるほど、正確にはそういう風になっていたのですか。 それは大変失礼しました。 C++だと、連続して使うならちょー短い名前のローカルのポインタconst変数に移し替えることが多かったので「ぜってー使わん!」でも全然OKだったのですが。 C#だったらフィールドに前置き「_」使うとよさそうですね。 > 残念ながら、その、ライブラリを作っているのです。 なるほど、そういう御用件でしたか >パブリック フィールドとプロテクト フィールドは適切にバージョン管理されず、またコード アクセス セキュリティ要求によって保護されません。 パブリックに参照可能なフィールドを使用する代わりにプライベート フィールドを使用し、それをプロパティを通じて公開してください。  そのまんまだと思います。 内部的に適切にバージョン管理されないようになってしまうので(どうしてそうなるかはMSしか知らないブラックボックスでも、問題ない) 公開するクラスライブラリのフィールドは 全部privateにしとけ、ということでしょう これは基本的なことですが 「局在性の高いもの」ほど 短い名前で済みやすいというのが挙げられます。 publicよりprotectedが、protectedよりprivateが メンバよりローカル変数のが 作用する相手は少なくて済むので、より短い名前で十分、というのはC、C++、C#すべて共通で言えると思います。 ローカル変数なんて、その関数内で使う数が少ないなど「実装者が十分バグフィックス楽なら」小文字1つでもOKなこともあります。

koumei000
質問者

お礼

 なるほど。勉強になりました。ありがとうございます。これから修正していきます。

関連するQ&A

  • C#で、デリゲートからその関数の名前を取得する方法

    次のコードを見てください。コメントにあるように デリゲートを引数とする関数内部で、そのデリゲートが受け取った関数の関数自身の名前を取得しようとしています。どうすればいいでしょうか? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ラムダ式 { public partial class Form1 : Form { public Form1() { InitializeComponent(); //引数aとbの初期値 this.textBoxA.Text = "10"; this.textBoxB.Text = "5"; } //int型を返し(I)int型2つを引数にする関数のデリゲート public delegate int I_II(int a, int b); public static int 足し算(int a, int b) { return a + b; } public static int 引き算(int a, int b) { return a - b; } public static int 掛け算(int a, int b) { return a * b; } public string 二項演算(I_II 演算方法) { //ここでは、演算方法.tostring()を使って"足し算" や"引き算"などの //関数名を得ようとしているが。この方法だと,デリゲートの名前 //すなわち I_II が帰ってきてしまう //どうすれば デリゲートが参照している関数名 ”足し算”や"引き算など" //を得ることができますか? string 関数名 = 演算方法.ToString(); return 関数名 + ": " + 演算方法(int.Parse(textBoxA.Text), int.Parse(textBoxA.Text)).ToString() + "\r\n"; } private void button1_Click(object sender, EventArgs e) { textBox結果表示.Text = ""; textBox結果表示.Text += 二項演算(足し算); textBox結果表示.Text += 二項演算(引き算); textBox結果表示.Text += 二項演算(掛け算); } } }

  • C#で実行時にメソッドの返り値の型を変化させる

    C# で、実行時にメソッドの返り値の型を変化させることは可能でしょうか? たとえば、 public class MyData { object o; public void setValue( object a ) { o = a; } public object getValue() { return o; } } というクラスがあるとき、 static void Main(string[] args) { MyData a = new MyData(); a.setValue( 3 ); Console.WriteLine( a.getValue().GetType().ToString() ); int i = (int)a.getValue(); } というコードを実行すると、 System.Int32 と表示されます。Main の 4 行目で、(int)のキャストをはずすと、object から int への暗黙の変換はできませんというコンパイルエラーになります。 この(int)のキャストをしなくてもエラーにならないような getValue の関数はできないでしょうか? o は、数値型であるとします。 たとえば、MyData に、 public int getInt() { return (int)o; } とすれば、必ず int を返すようなメソッドはできると思うのですが、これだと、getByte() や、getDouble() などのように、考えられるすべての型を想定してメソッドを作ることになってしまいます。 そうではなく、getValue() で、少なくとも数値型の暗黙の変換はしてくれるようなことにできないでしょうか。 よろしくお願いします。

  • C#で別スレッドからメインformをアクティブ化

    質問番号:7352165で質問中の者です。 デリゲートとInvokeを使ったスレッドでは、スレッド実行中にイベントが発生しないので止む無く直接スレッドを起動しているのですが、この方法ではメインformのTextBoxなどに直接アクセスできません。 それでアクセスするメソッドをデリゲート+Invokeで呼んでおり、TextBoxの表示は正常に動作していますが、フォーカスをメインformに移動させる為にActivate();メソッドを記述すると「フィールド初期化子は静的でないフィールド、メソッド、または……を参照できません」の記述エラーとなります。 あまり理解できていないので基本的な使い方が間違っているかも知れませんが、何か解決策があればお教え下さい。 public void FormActive()  ← メインform(fmTax)に記述 {   this.Activate(); } private delegate void ActivDelegate(); ← 別スレッドに記述 ActivDelegate activDelegate = delegate() {   fmTax.FormActive(); ← ここにエラー表示 };

  • デリゲートで子から親フォームのメソッド実行について

    お世話になります。 .NET C#で開発をしております初心者です。 下記の様なデリゲートで子フォームから親フォームのメソッドを実行 させようとしています。 すると、parent2.MeisaiSyutoku(); の部分で エラーが発生してしまいます。 (エラー内容:NullReferenceExceptionはハンドルされませんでした。        オブジェクト参照がオブジェクト インスタンスに設定されていません。) 同じ子フォームで(親フォームは違いますが)、もう1つデリゲートをやっているのですが それも何か悪かったりするでしょうか。 下記のデリゲートで、デリゲート(2)はちゃんと実行されますが、デリゲート(1)の方でエラー となってしまいます。 どなたかご親切な方、違う方法でも構いませんので、子フォームから 親フォームのメソッドを実行する方法を教えて下さいます様、 宜しくお願い致します。      記 デリゲート(1) 子フォーム側 parent2; //親フォームの参照 public void setOya2(案内書 parent) { this.parent2 = parent; //親フォームから参照を受け取って保持する } private void button2_Click(object sender, EventArgs e) { ~イベント処理~ parent2.MeisaiSyutoku(); //案内書.csのメソッド実行 } 親フォーム側 private void button4_Click(object sender, EventArgs e) { Global.openMOTO = 1; 台帳 n台帳 = new 台帳(); n台帳.setOya2(this); n台帳.Show(); } private delegate void ctlFromChild(); public void MeisaiSyutoku() { new Thread(new ThreadStart(delegate { Invoke((ctlFromChild)delegate { Get_MeisaiSyutoku(); }); })).Start(); } デリゲート(2) 子フォーム側 送り状作成 parent1; //親フォームの参照 public void setOya1(送り状作成 parent) { this.parent1 = parent; //親フォームから参照を受け取って保持する } private void fpSpread1_CellDoubleClick(object sender, CellClickEventArgs e) { ~イベント処理~ parent1.changeTextBox4(zOtodokeSaki);         } 親フォーム側 private void button1_Click(object sender, EventArgs e) { Global.openMOTO = 0; 台帳 n台帳 = new 台帳(); n台帳.setOya1(this); n台帳.Show(); } private delegate void ctlFromChild(); public void changeTextBox4(string str) { new Thread(new ThreadStart(delegate { Invoke((ctlFromChild)delegate { this.textBox4.Text = str; }); })).Start(); }

  • Visual Basic 2005 でのデリゲート、Invokeについて

    卒論の関係で、Visual Basic 2005 Express Editionを使用して、システムを構築しています。 スレッドまたはフォームが複数あるため、デリゲートを使用することになったのですが、invokeの対象であるメソッドで引数を使用することはできるのでしょうか? 引数なしの場合、現時点では次のように記述しています。 A.show() A.Invoke(New MethodInvoker(AddressOf A.Status_Timer)) Public Sub Status_Timer()   処理 End Sub MethodInvokerは、デリゲート宣言なしでinvokeを使えることができ、本来?のデリゲート宣言して、invokeを使う場合は以下のようになります。 A.show() A.Invoke(New SetFocusDelegate(AddressOf A.Status_Timer)) Delegate Sub SetFocusDelegate() Public Sub Status_Timer()   処理 End Sub ここで、Status_Timer()に引数を指定して、たとえば、 Public Sub Status_Timer(ByVal data As integer)   処理 End Sub とした場合、invokeでの記述がうまくいきません。 もともと、invokeではそんなことはできないかもしれませんが、何か方法ありますでしょうか?現時点では、引数を使用することができないので、スレッドまたはフォーム間で、プロパティを使用して、情報を渡しています。以下のような形です。できれば、プロパティを使用したくないのですが・・・ Public Property test() As state Get Return _test End Get Set(ByVal value As state) _test = value End Set End Property

  • C# 匿名メソッドについて

    http://www.atmarkit.co.jp/fdotnet/csharp20/csharp20_05/csharp20_05_02.html 匿名メソッドを勉強しています。 上記のサイトの最初のソースで using System; delegate void MyAction(); class Program { static MyAction CreateMethod() { string message = "Hello! World!"; return delegate() { Console.WriteLine(message); }; } static void Main(string[] args) { MyAction action = CreateMethod(); action(); // 出力:Hello! World! } } このソースに対して、 >>常識的に考えればこのプログラムは動作しないはずである。 >>なぜなら、変数messageはCreateMethodメソッドからリターンした瞬間に消滅するが、 >>匿名メソッドが呼ばれるのはその後だからである。 と書かれていますが、 私にはその不思議さがわかりません。 まず、インスタンスされたクラスは初めにMainを読みに行き、 MyAction action = CreateMethod();でCreateMethod()を実行する。その実行した中でreturn”message”が結果的にされる。 そして、それがactionに代入されるという流れだと思うのですが、なぜ、これが不思議なのでしょうか?

  • ActionScript(3.0)の命名規則について

    flashデベロッパーの方に参考意見をいただきたいです。(それ以外の方も大歓迎です) 変数の命名規則なのですが、皆様はどのような形で規則性を持たせていますか?参考書などを見ると結構それぞれに違う規則があるように感じました。 例えば今自分が考えているモノとしては ・private変数には_hogeのようにアンダースコアを。 ・public変数は通常通りhogeで。(getterも同様に) ・クラス変数は__hogeのようにアンダースコア2つで。 このくらいしか分類していないのですが、他にも引数やローカル変数にはこれがいい、とか、その他慣例やおススメがあれば是非ご意見をいただけますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • C#のスレッド動作について

    下記はスレッドの中で永久ループさせるテストプログラムで、1秒毎にテキストボックス内の数値をインクリメントします。 【問題点1】 ※1と※2のコマンドを削除した状態(※3のみ)で正常な動作を期待していたのですが、実際にはフリーズ状態となり、カウント値が表示されません。 ※2のApplication.DoEvent()を実装するか、※3の替わりに※1に実装すると正常動作となります。 ExecThread実行中は他の処理を出来なくても、これを抜けた時点で表示処理に移るので表示される筈と思っていたのですが違う様です。 【問題点2】 Invokeの替わりにBeginInvokeを使えばExecThread実行中でも他の処理と並列処理されると思っていたのですが、スレッドを2個用意して試したところInvokeと全く変わらず、やはりフリーズ状態となります。 【問題点3】 ExecThreadを匿名メソッドにすると「フィールド初期化子は、静的でないフィールド、メソッド、又はプロパティ'iCount'を参照できません」のエラーとなり、「iCount」をstatic変数にするとOKになります。 匿名メソッドではインスタンス変数は使えないのでしょうか。 上記3項目についてネットで調べたのですがその様な記述は見当たりませんでした。 何か使い方が間違っているのでしょうか? 間違い点など、ご指摘頂ければ有難いです。 どうぞ宜しくお願いします。 private void ExecWorker() ← スレッド {   while (true)   {     Invoke(new Exec1Delegate(this.ExecThread)); ← BeginInvokeを使っても症状は同じ     iCount++;     Thread.Sleep(1000); ← ※1 このSleepが無いとフリーズする     Application.DoEvent(); ← ※2 これがあると※1のSleepが無くてもOK   } } delegate void ExecDelegate(); private void ExecThread() {   lbThread.Text = iCount.ToString(); ← 匿名メソッドにするとエラーになる   Thread.Sleep(1000); ← ※3 (※1のSleepと同時実装はしない) }

  • C#のループについて

    現在C#でジャンケンゲームの課題に取り組んでいるのですが、ループ処理や各メソッドに対しての変数にエラーがでてしまい、修正方法が分からず、どなたか教えて頂けないでしょうか? ・ユーザはグー、チョキ、パーをそれぞれ1、2、3の数字で入力する。 ・CPUは乱数を使って出す手を選ぶ。 ・5回勝負として、人間とコンピュータの勝った回数を数え、勝敗がつくたびに1回ずつ表示する。    あいこは決着がつくまで再勝負。途中でどちらかが3勝しても、5回最後まで勝負を続ける。   ・指定された範囲以外の値を入力したら負けにする 【実行例】  ユーザ名を入力してください:goto  手を入力してください(グー1、チョキ2、パー3): 1  CPU:チョキ  WIN  goto:1勝、CPU:0勝    手を入力してください(グー1、チョキ2、パー3): 3  CPU:パー  DRAW    手を入力してください(グー1、チョキ2、パー3): 3  CPU:チョキ  LOSE  goto:1勝、CPU:1勝    手を入力してください(グー1、チョキ2、パー3): 0  LOSE(反則負け)  goto:1勝、CPU:2勝    (中略)    goto:3勝、CPU:2勝  gotoさんの総合勝利です! using System; namespace Ensyuu007 { static class Program { static string? Myhand; static int CntWin = 0; //勝利回数 static int CntLose = 0; //敗北回数 static int CntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string EnterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", EnterName); Console.ReadLine(); } //じゃんけんを5回行います。 for (int GameCnt = 0; GameCnt <= 5; GameCnt++) { //正しく入力されたかチェックを行うメソッド。 static string Check(ref string Myhand) { static = Console.ReadLine(); Console.WriteLine("手を入力してください(グー1、チョキ2、パー3):{0}", Myhand); //正しく入力されたかチェックします。 Check(ref Myhand); //0,1,2が入力された場合 if (Myhand.Equals("1") || Myhand.Equals("2") || Myhand.Equals("3")) { //入力した数字をそのまま返します。 return Myhand; } //1,2,3以外が入力された場合 else { Console.WriteLine("LOSE(反則負け)"); return Myhand; } } //じゃんけんを開始するメソッド。 static void Start() { //コンピューターとじゃんけんさせます。 Janken(ref Myhand); Console.ReadLine(); } //コンピュータと自分の入力した手を判別するメソッド static void Janken(ref string Myhand) { // Random クラスの新しいインスタンスを生成する Random ran = new System.Random(); //コンピュータの出す手を1以上3以下に設定する。 string[] com = new string[] { "1", "2", "3" }; string con = ran.Next(3).ToString(); //配列型、変数teに出す名前を設定 string[] te = { "グー", "チョキ", "パー" }; //コンピュータが勝利した場合 if (((Myhand == "1") && (con == "3")) || ((Myhand == "2") && (con == "1")) || ((Myhand == "3") && (con == "0"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("LOSE"); CntLose++; //敗北回数に加算 } //自分が勝利した場合 else if (((Myhand == "1") && (con == "2")) || ((Myhand == "2") && (con == "3")) || ((Myhand == "3") && (con == "1"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("WIN"); CntWin++; //勝利回数に加算 } //あいこだった場合 else { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("DRAW"); CntDraw++; //引分回数に加算 } } } static void Resurut() { if (CntWin > CntLose) { Console.WriteLine("総合勝利です"); } else if (CntLose < CntWin) { Console.WriteLine("CPUの総合勝利です"); }

  • C言語の関数の仮引数の記述

    関数の仮引数の( )の中に何の変数を書いたらいいかいまいちつかめていません。関数の実行文や、もしくはmain関数の呼び出し実行文とどんな互換性があってどの変数を書いていいかわからないので教えてください。一応わかる部分を少し書きますがたとえば、変数をコピーするint copy( int a, int b )ってゆーのがあるとすれば、bをaにコピーするために必要となる変数a、bを( int a, int b )と書けばいいと思うんですがどうでしょう?仮引数部分にはmain関数に返す値となる変数だけを書くとどうなるんでしょう? なんかわかりにくくてすいませんが、答えになってなくても関係することであれば返信ください。 あとコンパイラーはCygwinで、理解度はfor文やif文や関数、配列などの基本はだいたいOKです。ポインタとかその他の応用についてはわかりません。

専門家に質問してみよう