匿名メソッドとラムダ式について
みなさんこんにちは🌚
昨日朝ごはんを食べた瞬間に胸が苦しくなって病院に担ぎ込まれたブルーノです。結局原因は不明だそうですがいまだに深く息を吸い込むと胸が痛くなります。肋間神経痛かもしれません。まあしばらくご飯はゆっくり食べる事にします😅さて今回は匿名メソッドとラムダ式というものについてまとめていきます
匿名メソッド
前回はすでにあるメソッドをデリゲートを通して実行し、いちいちインスタンス化→実行という手間をかけない方法についてやりましたが、今度の匿名メソッドはメソッドをあらかじめ定義しておく必要も無くなってしまいます。では下の図を見てください
7~11行目のShowメソッドは入力された文字列をそのまま返すシンプルなものです。22行目でこのメソッドのデリゲートを作成し、次の行で呼び出しています。ここまでは従来のデリゲートと同じです。その次の25行目で少し従来のものと違った宣言の仕方をしているものがありますね。
MyDelegate b = delegate(引数) { ... }
従来のデリゲートと比較してみましょう
delegate b = new Mydelegate(引数)
デリゲート名(赤字)とデリゲートの宣言(青字)が逆になっているほか、匿名メソッドは後ろに{ ... } とありますね。実はここにメソッドの中身を書き込むようになっていて、デリゲートの宣言と中身をここでいっぺんにできてしまうのです。つまり、メソッドの名前を書き込まずにデリゲートの宣言だけでメソッドを作ることができるので、匿名のメソッドというわけですね!実行結果は見て分かるように両者に差はありません。では次に、この匿名メソッドをさらに簡略化できてしまうラムダ式についてまとめます。
先ほどの匿名メソッドの他にデリゲートを簡略化する方法として、ラムダ式というものが存在します。まずは下の画像を見てください。
メインメソッドの中の14行目が通常の呼び出し、16~17行目がラムダ式による呼び出しになっています。ラムダ式の呼び出し方は以下のようになっていますね
MyDelegate b = () => { ...; };
この{ ... }のなかで呼び出すメソッドを指定しています。この => という矢印みたいなものをラムダ演算子と言います。矢印の手前の()にはデリゲートへの引数が入ります。今回は引数は指定していないので空白ですね。また、{ ... }のなかに
{ Console.WriteLine("..."); }
のように直接メソッドの内容を書き込むこともできます。こうするとまるで匿名メソッドのようですね。さっきの4行程の匿名メソッドの記入がラムダ式なら1行で終わってしまいました。こっちの方が楽ですよね。実際C#の開発者の方も「ラムダ式が先に導入されていれば匿名メソッドはいらなかった」と発言しているそうです(笑)。
また、マルチキャストデリゲーションについては以下の通りです。
今回はここまでにしておきます。
ラムダ式があれば簡単なメソッドならいちいち定義せずに実行できてしまいそうですね。まあデリゲートの引数やデータ型の関係で似たようなメソッドしか定義できませんが便利そうです。今度は色々なunityゲームのオープンソースとかも見てみたいなぁ
デリゲート
みなさんこんにちは🌚
貧乏生活で身も心も細っていくブルーノです。バイトやめたら一気にお金なくなりました(T . T)習慣付いた浪費グセってこわい😭
さて今回からはデリゲートについてまとめて行きたいと思います
デリゲートについて
デリゲート(delegate)は英語で委任するという意味です。プログラミングにおいてはデータ型とパラメータリストを指定したデリゲートを宣言することでメソッドを代行してもらうことができます。どういうことか、何に使えるのかちょっと見てみます
デリゲートはクラス外で宣言しておいて16行目のようにインスタンス化する際にメソッドの名前を入力することでデリゲート名でそのメソッドを呼び出すことができるようになるんですね。結果はShowメソッドが2回呼び出されていますね。これはたまたま呼び出されるメソッドと呼び出すクラスが同じでした。今度は別のクラスで呼び出してみましょう。
注目するのは20行目で、デリゲートにクラスとその中のメソッドへの参照を入れています。
マルチキャストデリゲーションについて
まずはこちらのコードを見てください。
24行目でBruno069クラス内の高らかな笑い声のメソッドをデリゲートに当てて次の行で呼び出しています。そして27行目で今度はアヒルの鳴き声のメソッドを同じインスタンスに入れて呼び出しています。これを見ると一つのデリゲートに委託できるメソッドは一つだけなのでしょうか。いえいえ、実は呼び出すメソッドを追加することができるのです。この24行目の後に
m += new MyDelegate(b.show2);
とすることで、このデリゲートを呼び出した際ネズミとアヒルの両方の鳴き声を聞くことができるのです。逆にこの後に
m -= new MyDelegate(b.show1);
とすればアヒルの鳴き声だけになります。このように呼び出すメソッドをいくつも増やしたりすることをマルチキャストデリゲーションと言います。声に出して言いたいですね!
デリゲートの基本を説明したところで今回は終わります。
冬の大会でこの二週間忙しかったあ〜〜🤯🤯🤯
久しぶりにこの記事書くと楽しいです😊
もう12月ですね。このブログも半年続いたお知らせが来ましたがのんびりペースすぎますね...
もっと頑張ろうっと
DateTime構造体
みなさんこんにちは🌚
寒くなってきて長袖が必要になって来ましたがタンスの中を見てみると1着しか長袖がなかったブルーノです。また最近サボりがちになっていましたが更新していきたいと思います。今回は構造体の中でも便利なDateTime構造体についてです。
DateTime構造体について
C#にもともと用意されている構造体にDateTime構造体というものがあります。この構造体の中でもNowプロパティはとても便利で、現在の日付・時刻を年からミリ秒まで取得することができるのです。直接メモリにアクセスする値型にはこのようなあらかじめ備わっている機能もあるのですね。ちょっと使ってみます。
アプリを作る際なんかに大いに役立ちそうですね。
今回はこれで終わると同時に構造体についても終わります。次回からはデリゲートとイベントというものについてやっていきます。
夜と朝が寒くなってきて朝の早起きが大変になってきました。日課の早朝ランニングも最近はやっていないし、誰か俺を律してくれえ〜〜😭
値渡しと参照渡しの違いについて
みなさんこんにちは🌚
値渡しと参照渡しの違いがわからず、また値型と参照型を混同してしまって最近更新が遅れてしまっていたブルーノです。様々なサイトを駆けずり回ってようやく理解できたきがするのでここにノートとしてまとめておきます!
メソッドに値を加工してもらいたい時はメソッドのブランケット「()」にパラメータ(引数)を渡し、それを加工するのですがなんと渡すものやその方法によって結果が異なってくるのです。その違いが値渡しと参照渡しになります。
値渡しについて
この二つの名前のせいで翻弄され続けていましたがズバリ値渡しは、その値のコピーを渡すことです。主にint型やlong型などのプリミティブ型と呼ばれる関数を引数に渡す場合この値渡しになります。最初の方にやった「変数について」
変数について - ブルーノのC#プログラミング & unity勉強日記
という記事でも値型と参照型というキーワードが出てきましたがこれらデータ型とは別のものであり、値型だからと言って値渡しになるとは限らず、参照型の変数だからと言って参照渡しになるとは限らないのです。この重要な事項が関わってくるのがstring型で、これはデータ型は参照型ですが値渡しになるのです。良く使う型であるだけに注意が必要ですね。では何が値型になるのかというと、なんの補助もなくそのまま使う場合はオブジェクト以外のものがこの値渡しになります。
上の画像にあるようにint a = 6と宣言してint型の変数を一つ用意し、Ichitasuメソッドで1足してその値を返していますが結果は変わらず6のままです。これはIchitasuメソッドに渡された6とint aに格納されている6は別物だからです。Ichitasuメソッドに渡されたのはint aの値のコピーであり、要は13行めでIchitasu(6)と書いているも同然なのです。
オブジェクト以外って具体的になんだよと言いたくなると思いますが次の参照渡しでオブジェクトをまとめるのでそれ以外と覚えてください。
参照渡しについて
では参照渡しとはなんなのか、オブジェクトをメソッドに渡す際はこの参照渡しになるのですが、参照渡しはオブジェクトそのものを加工してもらいます。
12行めではint aしか書かれていないBruno063クラスをオブジェクト化しています。そしてBruno063クラスを加工するIchitasuメソッドが13~16行めに記述されています。このそして17行めでこのIchitasuメソッドに渡されたBruno063 b は加工されます。これはコピーではなく現物で行われます。つまり、クラスからオブジェクト化されたものは加工できるということになります。ですが同じクラス内でメソッドに渡して加工したい時もありますよね。いちいちオブジェクト化しなければならないのは面倒だ...そこで使えるのがref, outキーワードなんですね。refキーワードをつけた引数は参照渡しになるため、メソッドに渡されるのはコピーではなくそのものになるのです。
最後に
オブジェクトは参照渡しになるのでクラスから作られる=参照渡しと捉えて良いですが構造体の場合は値型でしたね。構造体も使いたい場合はstruct sのようにクラスのオブジェクト化の時と似た感じで使いますが構造体は値型であるため、メソッドに渡す際はrefキーワードをつけて参照呼び出しにする必要があります。この部分がこの一週間わからず悩んでいたところです。スッキリしたところで今回は終わります。
あー早くunityの方に取り掛かってアプリ開発にも着手しないともう時間がない...もう今の知識だけでスクリプト面は大丈夫なのだろうか....
構造体2
みなさんこんにちは🌚
台風の土日をずっと家で引きこもっていたブルーノです。珍しくずっと家で寝てたなー。あんまり気分が上がらなかったからか。さて前回、構造体とはどんなものかを大まかにやりました。そのまとめは容量の少ないクラスなら構造体にした方が素早くアクセスでき、効率的、というものでした。ではクラスを作成した時に「これなら構造体にした方が良くないか?」と思うことができるように、クラスでも構造体でもできることについて微妙な違いも一緒にまとめたいと思います。
静的メンバ
構造体も静的メンバを扱うことができます。静的メンバは各インスタンス間で共有できる変わらない値をクラス内で扱う際、インスタンス化せずにいきなりアクセスできるメンバのことですね(この説明では不十分かもしれませんが...)。
上の画像にあるようにBruno055構造体のメンバに全てstaticキーワードが付いており、それ故にBruno056クラスではBruno055構造体をインスタンス化せずに直接メンバを呼び出しています。
コンストラクタを持つ構造体
構造体もまた、newキーワードでインスタンス化するとコンストラクタが呼び出されます。自作のコンストラクタがない場合はデフォルトコンストラクタが呼び出されますが、構造体の自作のコンストラクタを呼び出す場合はパラメータリスト(引数)が必要になります。下に例を示します。
この中で特筆すべき点は主に2点あり、一つがまず7行目のBruno057構造体の自作コンストラクタで、パラメータリストを用意しています。ここに何も入っていないとエラーとなります。
そしてもう一つが17行目で、Bruno057構造体をインスタンス化する際に引数を入力していませんがエラーになりません。この場合インスタンスは0で初期化されることを覚えておきましょう。引数は必要だが呼び出す際に引数はなくても良い。中々便利なのかめんどくさいのか分からないです。
インターフェイスの実装
構造体でも、newキーワードを使ってインスタンス化すればインターフェイスを実装できます。
ちゃんとBruno060クラスがBruno059インターフェイスを実装できていますね 。あと、36行めでもしnewキーワードを使わずに
Bruno060 b;
とだけ宣言した場合はエラーとなってしまいます。今回はこのあたりにしておきます。
最近新しく知ったBURNOUT SYNDROMESというアーティストにはまっています。そこから芋づる式にハイスコアガールという漫画も知って一気買いしてしまいました。なんか版権とかがいろいろ大変みたいですが続きが読みたいですね😑😑
構造体
みなさんこんにちは🌚
宇宙から見たオーロラをテレビで見てとても感動したブルーノです。いつか気楽に宇宙旅行できてこの光景がただのSNS映えのバックとして投稿される未来が来るんでしょうか。キレイやなあ😍😍
さて今回からは構造体についてまとめていきたいと思います
構造体について
今までクラスについてのみ扱ってきましたが実はクラスに似たものに構造体という概念があります。クラスとの違いとしてはいろいろありますが大きな違いはクラスが参照型であるのに対し構造体は値型であるということです。参照型・値型というワードは一番最初の型についてをやった時やref・out参照の時にやったことがあるのですがちょっとあやふやですね。
値型...それぞれの値が数値を持つ
参照型...それぞれの値に参照アドレスを持つ
これはつまりどういうことかというと例えば値を変更する際に
- 値型の場合は宣言した値分だけデータを作るために容量が大きいがアクセスは早い
- 逆に参照型は宣言した値にあるのは大元のデータの在り処だけなので容量は小さいがアクセスする際にいちいち探しに行くので少しアクセスは遅くなる
という事です。それ以外の点ではクラスの方ができることの方が基本的に多いので構造体の用途としては少ないデータを扱う際に用いることでうまく効率化できるという旨がマイクロソフトのサイトの方にも載っていました。では、クラスとの違いを表すための簡単なプログラムを組んでみます。
この画像は実行不可なプログラムです。注意書きにもあるようにクラスの時はおなじみだった
public int x = 7;
等の初期化子を使ってインスタンス変数を初期化するということができないのです。この場合はちゃんと分けて
のように入力しなければなりません。これが一応際立った違いのようです。
とりあえず今回はここまでにしておきます。
バイトでバーの運営をこの前手伝ったのですがスパークリングワインとシャンパンは違うものなんですね。初めて知りました。他にも大学生の私では普段手が出せないようなメニューも扱っていてとても新鮮でした。当然ですが良いお酒は美味しいんですねやっぱり😌
インターフェースの継承
みなさんこんにちは🌚
サンシャイン池崎、サンドウィッチマン、我が家、ロバートがお笑いではお気に入りのブルーノです。大体狂ったキャラのお笑いが好きなんですね😅
さて今回はインターフェースの継承についてです
インターフェースもクラスと同様に継承することができます。この場合、継承したインターフェースをクラスで用いた場合は継承元も全て実装しなければいけません。
IBruno049インターフェイスとIBruno050インターフェイスでデータや合計、平均を実装することを約束させ、Bruno051クラスで実装しています。なおこの時(15行目)に継承元をIBruno050しか書いていませんが、ちゃんとIBruno049も継承されています。なお、この時IBruno049のメンバを実装しなければエラーになります。今回はここまでにしておきます。
最近はスマホの普及でアプリの幅もジャンルもたくさん増えてきてびっくりするような興味深いものもたくさん出ています。最近はそういったアプリの構成がどんな風になっているのか考えるのが楽しいです。まだ全然作り方はわかりませんが笑