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)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

すみません, C# と関係ないところで 1点突っ込ませてください>#3. 「__」および「_+大文字」で始まる識別子は完全に処理系予約ですが, 「_」で始まるその他の識別子は ・C なら「ファイルスコープ」で予約 ・C++ なら「グローバル名前空間」 (と ::std 名前空間) で予約 です. つまり, どちらにおいても構造体メンバや関数にローカルな変数 (引数を含む) 名には利用可能です. たぶんこの辺は C# でも同じなんじゃないでしょうか. もっとも, 「ふつ~の識別子」を使っても規格が変わったらアウトだったりしますが. 戻って, と. あ, 「delegate には命名規則がある」ということは, 逆に言えば Func<ほにゃらら> なんかを使えば「自由な名前にできる」 かも. ただ, そうするとやっぱり「使う場面」を想定しておく必要があるんじゃないかな. もちろん delegate (相当) なので「使う場面」には ・その delegate (相当) を取り出す場面 ・取り出した delegate (相当) を使ってメソッドなりなんなりを呼び出す場面 の両方を考えないといけないんでしょうね.

回答No.5

Func<int> は delegate int デリゲート名(); とおんなじことですよ。 Actionは戻り値voidですが Funcの場合、<>内が一個なら Func<戻り値>で 二個以上だと Func<引数1, 引数2, 戻り値> 等のようになります。 >実は、この「private」級のフィールド変数の命名には苦心しています。 もし大量に既に作ってしまっているなら その部分については一端そのままでもいい、かもしれません。 (将来バージョンアップでコンパイルエラーが出たらそこだけ直す、など) 「これ以上ないシンプルかつ分かりやすい名前」というのは、その場の全体の構造の影響をうけますから 何がどうなってるのかが見せていただくことが出来れば (オブジェクト指向的な構造化というのはC++でもC#でも十分通じるところがあると思うので) もうちょい方法を考えれる、かもしれません。

koumei000
質問者

お礼

 ご指摘ありがとうございます。 > なので、koumei000さんがライブラリ作成時の話をされているのならこの通りでしょうが  残念ながら、その、ライブラリを作っているのです。  先ほどフィールドのデザインを見たのですが、それによると「protected」なフィールドはダメと在るのですが、具体的にはどうダメなのでしょうか? (パブリック フィールドとプロテクト フィールドは適切にバージョン管理されず、またコード アクセス セキュリティ要求によって保護されません。 パブリックに参照可能なフィールドを使用する代わりにプライベート フィールドを使用し、それをプロパティを通じて公開してください。 → ???) > Func<int>はdelegate int デリゲート名();とおんなじことですよ。  お恥ずかしいことに  「delegate void Fanc<TResult>(out TResult result)」  と見間違えていたようです。  また、以前 https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/List.cs などmonoのサンプルを見たので、フィールド変数の頭にアンダースコアをつけるようになったのですが、参考にしないほうがよかったのでしょうか? あと、アンダースコアを使わないとすれば、どうするのがよいでしょうか?

回答No.4

て#2さんのリンク先って 「クラス ライブラリ開発のデザイン ガイドライン」 じゃないですかw どうも規則(書かれ方)がかつかつすぎないかと思ったらw これは「後で別のアセンブリから使いまわされるライブラリ」を開発するなら、こういうガイドラインに沿った方がいいだろう という提案なので http://msdn.microsoft.com/ja-jp/library/ms229042.aspx >一貫性のないライブラリ デザインは、開発者の生産性を損なうだけでなく、ライブラリを採用する意欲を失わせます。 「採用する意欲」という言葉からわかるように、これは自分だけで使うものとはちょっと事情が異なります。 なので、koumei000さんがライブラリ作成時の話をされているのなら この通りでしょうが exeに入るinternalな感じのクラスとかだったら、もうちょっと自由でいいと思います。

回答No.3

なるほど、C#(というか.NET)は名前のガイドラインまでMSにあるとは どっぷりMSの管轄って感じですねw 実際には MS以外の人のサンプルコードではDelegate何々とかよく見かけましたが MSDNが >イベント ハンドラーではないデリゲートの名前には、サフィックス Callback を追加します。 >サフィックス Delegate は、デリゲートに追加しないでください。 と書いている、ということは、「Delegate」その物に関しては 将来の拡張予定かなんかがあるのかもしれません。 ネイティブC++にしょっちゅう触っているのでCallbackと言われるとWindowsAPIの事を連想してしまいますが、.NETではイベントハンドラ以外のdelegateで前衛的に使われてる、って感じなんでしょうか。 もちろん、会社とかで独自のやり方があるならそっちの方に優先して合わせた方が良いと思いますが、特に現状そう言う事はないのであれば、MSDNに従っとけば.NETっぽく合わせられるし、将来的な危険も少ないってことでしょうね。(MSの気まぐれは分からんので、「おそらくは」ですが) 個人的には GettingValueActionで 引数が空でintが戻ってくるというイメージがしにくい(「インスタンス.動作名(とくに~Action)」だと、どっちかっていうと引数をとってそれをもとにインスタンスの内部状態が変わって、引数は関知しない(つまりvoid)っていうイメージ)っていうのがあります。 実際System.Actionデリゲートは戻り値voidですよね >ただし,EventHandler<T>,ActionやFuncといった汎用のデリゲートがある そうでした。「ああ、C#」 この場合ですと 戻り値がvoidじゃなくEventHandlerじゃないと仮定して 同じようなことをやるんならFunc<int>で行けませんか? ↓例えばこんなイメージ using System; //上の方で ・ ・ ・ sealed class BBB { //たとえなので名前は適当ですが public Func<int> geti; public BBB(int i) { geti = () => { return i; }; } } class AAA { protected readonly BBB bbb; public int Value { get { return bbb.geti(); } } public AAA( BBB bbb_ ) { bbb = bbb_; } } どっかで BBB bbb = new BBB(111); AAA aaa = new AAA( bbb ); なんちゃら = aaa.Value… などなど ただ、これが今回適切なのかどうかはもうちょっと広い範囲のコード見ないと何とも言えないです。 もひとつ protected SampleBox _sampleBox; この「_」ですが、CやC++だと前方に付けるのは「予約語やdefine等々とのかぶり」の危険が付きまといます。(将来の拡張もかんがえて) C#だとどうなんでしょう。 と思ってやってみたら 早速 System._AppDomain うーん、やな予感w C#でも、前方に付けるのは避けた方が良いんじゃないでしょうかね。

koumei000
質問者

お礼

 ご指摘ありがとうございます。 > 個人的にはGettingValueActionで引数が空でintが戻ってくるというイメージがしにくい(「インスタンス.動作名(とくに~Action)」だと、どっちかっていうと引数をとってそれをもとにインスタンスの内部状態が変わって、引数は関知しない(つまりvoid)っていうイメージ)っていうのがあります。  慌てすぎました。「GettingValueFanc」の間違いです。 > 同じようなことをやるんならFunc<int>で行けませんか?  戻り値を持たないくせに引数を増やされるのは速度の面からもよくありませんし、(今回は)コードの見た目も悪くなるので避けています。 > この「_」ですが、CやC++だと前方に付けるのは「予約語やdefine等々とのかぶり」の危険が付きまといます。(将来の拡張もかんがえて)  実は、この「private」級のフィールド変数の命名には苦心しています。Camel方式ではどうしてもローカル変数とかぶることが多く、自動プロパティの puclic int Aaa { get; set; } で生成されるフィールド変数、「__aaa」を真似ていた時期もあったのですが、何せ、見た目が汚いので止めました。  そんなこんなでフィールド変数の形式の模索とリファクタリングで悠に2~3週間累計で消費しおります。  こちらに関しても、もう少しご意見いただけたら幸いです。

回答No.2

デリゲートの名前については ・イベント用の場合,EventHandlerをサフィックスに付ける ・イベント用以外の場合,Callbackをサフィックスに付ける というのがMSDNに書いてあります。 http://msdn.microsoft.com/ja-jp/library/ms229040.aspx ただし,EventHandler<T>,ActionやFuncといった汎用のデリゲートがあるため, outパラメータやrefパラメータを使う場合を除くと,デリゲートを定義する必要性が乏しいのも事実です。 デリゲート型のプロパティ,というのはあまり例がないのですが,プロパティ自体は基本的に,「名詞・名詞句・形容詞」を付ける,ということになっています。 http://msdn.microsoft.com/ja-jp/library/ms229012.aspx 一応,探すと MSDN: ServicePointManager.ServerCertificateValidationCallback プロパティ (System.Net) http://msdn.microsoft.com/ja-jp/library/system.net.servicepointmanager.servercertificatevalidationcallback.aspx というものが出てきます。信頼できない証明書を受け入れるかどうかを決定するためのコールバックです。 これをプロパティとするのはどうかとは思うのですが,デリゲート型のプロパティを作るのであれば上記のようにサフィックス「Callback」を追加するのはよいと思います。

koumei000
質問者

お礼

 解答ありがとうございます。 > ・イベント用以外の場合,Callbackをサフィックスに付けるというのがMSDNに書いてあります。  はい。すっかり忘れていました。これに従えば「ValueChangedHandler」を見習って、「ValueGettingCallback」(この場合は動名詞じゃなくて、未来の意味を含むing形です)ということになりますよね?  あと、Actionを参考にして、「ValueGettingAction」、「GettingValueAction」などの型名も思いついたのですが、いかがでしょうか? よろしければ添削をお願いします。

回答No.1

C#にくわしくはありませんが(自分自身の勉強も兼ねて) C++はよくやるので、そこから判断すると デリゲートはざっくり言うと関数ポインタみたいなものですから public delegate int SampleDelegate(); これは、引数なしでint型の変数を戻す、単なる「型」です。 なので、あまり具体的な名前が必要というわけではないというのが普通です。 「この用途で、この辺でだけ使いたい」という事ならpublicにはしないと思いますし もちろん、GettingValueなどなどは抽象的な名前だと思いますがw むしろ、「ぱっと見delegateと分かることの方が」ウエイトは大きいかもしれません。 delegateでintをGetするから DelegGetIntとかでもいいかと。(あくまで例え) あるいは大文字小文字を自分なりに使い分けて 変数の場合はこういうパターンが多い、クラスの場合はこういうパターンが多い というのを揃えることは結構大事です。 私がC++で関数ポインタをtypedefするときは全部大文字ってのが多めで、単なる変数は全部小文字にしがちなので、C#にそのまま当てはめると例えばこうでしょうか private delegate int DELEG_GETINT(); private DELEG_GETINT getvalue; public int Value { get { return getvalue(); } protected set { getvalue = () => { return value; }; } } この辺の流儀は自由でしょうが 本当にこだわるなら、色々なサイトや書籍で「概してこうなってるパターンが多い」というものを採用していけば、誰かが見たときも見やすくなる可能性が高いと思います。 少なくともC++では動名詞ってのはそんなに見ない気がしますね。 もちろん全くではないですが 十分クラスごとに機能分割してれば、単なる動詞一個だけでも挙動がだいたい予測できることもありますし。 ただ getやsetって、通常はこういう感じで使いませんか? internal sealed class AAA { readonly string name; int state; //プロパティを使わない場合は毎回こうなる恐れがあるので internal string GetName() { return name; } internal int State { //stateをprivateにしてState経由でget,set get { return state; } set { state = value; } } internal void IncrementState(){ ++state; } internal AAA(string name_) { name = name_; state = 0; } } あるいは http://ufcpp.net/study/csharp/oo_property.html とかでも ※単なる物のたとえという事ならいいですが public SampleDelegate SampleAction; という風に、敢えてSampleActionをpublicにするのなら SampleActionをそのまま呼び出す、のではだめな状況でしょうか?

koumei000
質問者

お礼

 ご意見、ご指摘ありがとうございます。参考にさせてもらいます。 > DelegGetIntとかでもいいかと。(あくまで例え)  プレフィックスはなんだか悪いイメージなので「Callback」などのサフィックスにします。 > getやsetって、通常はこういう感じで使いませんか?  実は初期化時にデリゲート変数入りのオブジェクトを渡してもらって、そのオブジェクトごと「protected」フィールドに代入。そのプロパティ内でオブジェクトからデリゲート変数を読み出して使用、という形を取っているのですが、本項とは直接関係が無いと思い、かなり端折って書かせていただきました。 // ―――――――――――――――――――――――――――― // デリゲート変数を格納 protected SampleBox _sampleBox; public int Value {   get { return _sampleBox.SampleAction(); } } public SampleClass(…, SampleBox sampleBox, …) {   ……   _sampleBox = sampleBox;   …… } // ―――――――――――――――――――――――――――― > SampleActionをそのまま呼び出す、のではだめな状況でしょうか?  「ptotected」の間違いでした。  「Callback」のサフィックスに従えば「ValueChangedHandler」を見習って、「ValueGettingCallback」(この場合は動名詞じゃなくて、未来の意味を含むing形です)ということになりますよね?  あと、Actionを参考にして、「ValueGettingAction」、「GettingValueAction」などの型名も思いついたのですが、いかがでしょうか? よろしければ添削をお願いします。

関連する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です。ポインタとかその他の応用についてはわかりません。

専門家に質問してみよう