ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

値渡しと参照渡しの違いについて

f:id:covory10101101276:20171108190139j:plainみなさんこんにちは🌚

値渡しと参照渡しの違いがわからず、また値型と参照型を混同してしまって最近更新が遅れてしまっていたブルーノです。様々なサイトを駆けずり回ってようやく理解できたきがするのでここにノートとしてまとめておきます!

 

メソッドに値を加工してもらいたい時はメソッドのブランケット「()」にパラメータ(引数)を渡し、それを加工するのですがなんと渡すものやその方法によって結果が異なってくるのです。その違いが値渡しと参照渡しになります。

値渡しについて

この二つの名前のせいで翻弄され続けていましたがズバリ値渡しは、その値のコピーを渡すことです。主にint型やlong型などのプリミティブ型と呼ばれる関数を引数に渡す場合この値渡しになります。最初の方にやった「変数について」

変数について - ブルーノのC#プログラミング & unity勉強日記

という記事でも値型と参照型というキーワードが出てきましたがこれらデータ型とは別のものであり、値型だからと言って値渡しになるとは限らず、参照型の変数だからと言って参照渡しになるとは限らないのです。この重要な事項が関わってくるのがstring型で、これはデータ型は参照型ですが値渡しになるのです。良く使う型であるだけに注意が必要ですね。では何が値型になるのかというと、なんの補助もなくそのまま使う場合はオブジェクト以外のものがこの値渡しになります。

f:id:covory10101101276:20171108200146p:plain

f:id:covory10101101276:20171108200150p:plain

上の画像にあるようにint a = 6と宣言してint型の変数を一つ用意し、Ichitasuメソッドで1足してその値を返していますが結果は変わらず6のままです。これはIchitasuメソッドに渡された6とint aに格納されている6は別物だからです。Ichitasuメソッドに渡されたのはint aの値のコピーであり、要は13行めでIchitasu(6)と書いているも同然なのです。

オブジェクト以外って具体的になんだよと言いたくなると思いますが次の参照渡しでオブジェクトをまとめるのでそれ以外と覚えてください。

 

参照渡しについて

では参照渡しとはなんなのか、オブジェクトをメソッドに渡す際はこの参照渡しになるのですが、参照渡しはオブジェクトそのものを加工してもらいます。

f:id:covory10101101276:20171108202900p:plain

f:id:covory10101101276:20171108202904p:plain

 

12行めではint aしか書かれていないBruno063クラスをオブジェクト化しています。そしてBruno063クラスを加工するIchitasuメソッドが13~16行めに記述されています。このそして17行めでこのIchitasuメソッドに渡されたBruno063 b は加工されます。これはコピーではなく現物で行われます。つまり、クラスからオブジェクト化されたものは加工できるということになります。ですが同じクラス内でメソッドに渡して加工したい時もありますよね。いちいちオブジェクト化しなければならないのは面倒だ...そこで使えるのがref, outキーワードなんですね。refキーワードをつけた引数は参照渡しになるため、メソッドに渡されるのはコピーではなくそのものになるのです。

 

最後に

オブジェクトは参照渡しになるのでクラスから作られる=参照渡しと捉えて良いですが構造体の場合は値型でしたね。構造体も使いたい場合はstruct sのようにクラスのオブジェクト化の時と似た感じで使いますが構造体は値型であるため、メソッドに渡す際はrefキーワードをつけて参照呼び出しにする必要があります。この部分がこの一週間わからず悩んでいたところです。スッキリしたところで今回は終わります。

 

あー早くunityの方に取り掛かってアプリ開発にも着手しないともう時間がない...もう今の知識だけでスクリプト面は大丈夫なのだろうか....

構造体2

f:id:covory10101101276:20171026103218j:image

みなさんこんにちは🌚

 台風の土日をずっと家で引きこもっていたブルーノです。珍しくずっと家で寝てたなー。あんまり気分が上がらなかったからか。さて前回、構造体とはどんなものかを大まかにやりました。そのまとめは容量の少ないクラスなら構造体にした方が素早くアクセスでき、効率的、というものでした。ではクラスを作成した時に「これなら構造体にした方が良くないか?」と思うことができるように、クラスでも構造体でもできることについて微妙な違いも一緒にまとめたいと思います。

 

静的メンバ

構造体も静的メンバを扱うことができます。静的メンバは各インスタンス間で共有できる変わらない値をクラス内で扱う際、インスタンス化せずにいきなりアクセスできるメンバのことですね(この説明では不十分かもしれませんが...)。

f:id:covory10101101276:20171030143750p:imagef:id:covory10101101276:20171030143753p:image

上の画像にあるようにBruno055構造体のメンバに全てstaticキーワードが付いており、それ故にBruno056クラスではBruno055構造体をインスタンス化せずに直接メンバを呼び出しています。

 

コンストラクタを持つ構造体

構造体もまた、newキーワードでインスタンス化するとコンストラクタが呼び出されます。自作のコンストラクタがない場合はデフォルトコンストラクタが呼び出されますが、構造体の自作のコンストラクタを呼び出す場合はパラメータリスト(引数)が必要になります。下に例を示します。

f:id:covory10101101276:20171030165530p:imagef:id:covory10101101276:20171030165533p:image

この中で特筆すべき点は主に2点あり、一つがまず7行目のBruno057構造体の自作コンストラクタで、パラメータリストを用意しています。ここに何も入っていないとエラーとなります。

そしてもう一つが17行目で、Bruno057構造体をインスタンス化する際に引数を入力していませんがエラーになりません。この場合インスタンスは0で初期化されることを覚えておきましょう。引数は必要だが呼び出す際に引数はなくても良い。中々便利なのかめんどくさいのか分からないです。

 

インターフェイスの実装

構造体でも、newキーワードを使ってインスタンス化すればインターフェイスを実装できます。

f:id:covory10101101276:20171031055451p:plain

f:id:covory10101101276:20171031055458p:plain

ちゃんとBruno060クラスがBruno059インターフェイスを実装できていますね 。あと、36行めでもしnewキーワードを使わずに

Bruno060 b;

とだけ宣言した場合はエラーとなってしまいます。今回はこのあたりにしておきます。

 

最近新しく知ったBURNOUT SYNDROMESというアーティストにはまっています。そこから芋づる式にハイスコアガールという漫画も知って一気買いしてしまいました。なんか版権とかがいろいろ大変みたいですが続きが読みたいですね😑😑 

構造体

f:id:covory10101101276:20171024115054j:image

みなさんこんにちは🌚

宇宙から見たオーロラをテレビで見てとても感動したブルーノです。いつか気楽に宇宙旅行できてこの光景がただのSNS映えのバックとして投稿される未来が来るんでしょうか。キレイやなあ😍😍

さて今回からは構造体についてまとめていきたいと思います

 

構造体について

 今までクラスについてのみ扱ってきましたが実はクラスに似たものに構造体という概念があります。クラスとの違いとしてはいろいろありますが大きな違いはクラス参照型であるのに対し構造体値型であるということです。参照型・値型というワードは一番最初の型についてをやった時やref・out参照の時にやったことがあるのですがちょっとあやふやですね。

値型...それぞれの値が数値を持つ

参照型...それぞれの値に参照アドレスを持つ

これはつまりどういうことかというと例えば値を変更する際に

  • 値型の場合は宣言した値分だけデータを作るために容量が大きいアクセスは早い
  • 逆に参照型は宣言した値にあるのは大元のデータの在り処だけなので容量は小さいがアクセスする際にいちいち探しに行くので少しアクセスは遅くなる

という事です。それ以外の点ではクラスの方ができることの方が基本的に多いので構造体の用途としては少ないデータを扱う際に用いることでうまく効率化できるという旨がマイクロソフトのサイトの方にも載っていました。では、クラスとの違いを表すための簡単なプログラムを組んでみます。

f:id:covory10101101276:20171025070937p:plain

この画像は実行不可なプログラムです。注意書きにもあるようにクラスの時はおなじみだった

public int x = 7;

等の初期化子を使ってインスタンス変数を初期化するということができないのです。この場合はちゃんと分けて

f:id:covory10101101276:20171025071359p:plain

f:id:covory10101101276:20171025071406p:plain

のように入力しなければなりません。これが一応際立った違いのようです。

とりあえず今回はここまでにしておきます。

 

バイトでバーの運営をこの前手伝ったのですがスパークリングワインとシャンパンは違うものなんですね。初めて知りました。他にも大学生の私では普段手が出せないようなメニューも扱っていてとても新鮮でした。当然ですが良いお酒は美味しいんですねやっぱり😌

 

 

インターフェースの継承

f:id:covory10101101276:20171020111147j:image

みなさんこんにちは🌚

サンシャイン池崎サンドウィッチマン、我が家、ロバートがお笑いではお気に入りのブルーノです。大体狂ったキャラのお笑いが好きなんですね😅

さて今回はインターフェースの継承についてです

 

インターフェースもクラスと同様に継承することができます。この場合、継承したインターフェースをクラスで用いた場合は継承元も全て実装しなければいけません。

f:id:covory10101101276:20171020201840p:plain

f:id:covory10101101276:20171020201902p:plain

f:id:covory10101101276:20171020201905p:plain

IBruno049インターフェイスとIBruno050インターフェイスでデータや合計、平均を実装することを約束させ、Bruno051クラスで実装しています。なおこの時(15行目)に継承元をIBruno050しか書いていませんが、ちゃんとIBruno049も継承されています。なお、この時IBruno049のメンバを実装しなければエラーになります。今回はここまでにしておきます。

 

最近はスマホの普及でアプリの幅もジャンルもたくさん増えてきてびっくりするような興味深いものもたくさん出ています。最近はそういったアプリの構成がどんな風になっているのか考えるのが楽しいです。まだ全然作り方はわかりませんが笑

インターフェースの実装について

f:id:covory10101101276:20171013093226j:image

みなさんこんにちは🌚

秋が来ているはずなのに雨続きでうまく紅葉を楽しめませんブルーノです😓まあ雨が滴る紅葉もキレイですけどね笑

さて今回からはインターフェースについてやって行こうと思います

インターフェースについて

インターフェースとは、前回やった抽象クラスに似ており、その特性をより拡張したものとも言えます。

インターフェースの宣言はinterfaceキーワードを使って行います。

interface インターフェース名

{

    抽象メンバ

    ....

}

抽象メンバとは、前回抽象クラスでやったように何も実装されていないメソッドプロパティインデクサのことを指します。

インターフェースをクラスに実装するには、クラスの継承のように「:」を使ってどのインターフェースを使うかを明示します。派生クラスにインターフェースを実行させたい場合は基本クラスを先に書きます

例)

・class クラス名 : インターフェース

・class 派生クラス名 : 基本クラス名, インターフェース

では実際にやってみます。

f:id:covory10101101276:20171013105840p:imagef:id:covory10101101276:20171013105844p:imagef:id:covory10101101276:20171013105845p:image

全てのメンバを実装し、検証してみました。14行目までのインターフェースで宣言しているのは

・仮装メソッド(show)

・仮想プロパティ(prop)

・仮想インデクサ

と言います。最後のインデクサは142857というある数字にいろんな一桁の整数をかけているのですがこれが面白くて、1~6までの数字をこの数にかけるとどれも「142857」という数字が繰り返しているのです。そして7をかけると999999になります8, 9もなんかそれっぽい数字になるという面白い数なのです🤣今回はここまでにしておきます。

 

プログラミングの中には様々な英単語がキーワードとして出て来ます。英語が得意だとプログラミングも学習しやすいと思います。じゃあ外国人は スラスラできるのかな?周りみんなTOEICやってるからやろうかな〜🤔🤔

 

 

クラスやメソッドの分割定義

f:id:covory10101101276:20171012224418j:plain

みなさんこんにちは🌚

YouTubeでSASUKEの動画を見つけてみてたら時間が経つのも忘れて見入ってしまいましたブルーノです😃昔はよくやってた気もしますが最近は全然見かけなくなりましたね。またやってくれればいいのにな〜。さて今回は分割定義についてです。

分割定義について

C#ではクラスやメソッドの頭にpartialキーワードをつけることで定義を分割することができます。例で表すとこんな感じです。

例)partialクラス

partial class Bruno

{

    int x;

}

partia class Bruno

{

    x = 7;

}

 

 

これでそれぞれの中括弧{ }の中には一つの要素しかありませんが2つ目のx = 7はちゃんと一つ目のint xに格納されています。

例)partialメソッド

partial class Bruno

{

    public static void Main()

    {

        Bruno b = new Bruno();

        b.Show();

    }

    partial void Show();

}

partial class Bruno

{

    partial void Show() {

    Console.WriteLine("いえーい");

    }

}

 

パーシャルメソッドも同様別の括弧内で定義することでそれ以外の括弧内で同様の要素を使用することができます。しかし注意しなければならないことがあり、partialメソッドの戻り値はvoidで、アクセス修飾子はprivate出なければなりません。また、パーシャルメソッドの宣言と定義はそのパーシャルクラス内でなければなりません。つまりパーシャルメソッドを使いたい場合は必然的にパーシャルメソッドも使うことになります。

このパーシャルクラスたちは、個人のみで使うプログラムの場合はあまり意味がありません。しかしプロジェクトによっては複数人、もしリリースするならカスタマーを含め大量の人が目にする場合があります。そんな時、あるクラスの中に追記できるようにしたいが既存のプログラムは残しておきたい、もしくは見た目が複雑で邪魔だという時に、見えないところでこのパーシャルクラスを作り実装しておくそうです。partialキーワードがついている場合は必ずしも全てがその括弧内に収まっているとは限らないのです。今回はここまでにしておきます。

 

最近インド映画の「きっとうまくいく」をみました。インド映画特有のノリとテンポの良さが詰め込まれていて観ていて元気が湧いてきました😋これぐらい前向きに毎日を生きていきたいです笑

abstract(抽象)クラス

f:id:covory10101101276:20171011083719j:plain

みなさんこんにちは🌚

朝は空気が澄んでいてとてもランニングしやすいです。起きるのは大変ですがちょっと早起きして外にくりだしてみると案外気持ちいいですよ笑

さて今回はのちにやるインターフェースというものに似ている抽象クラスについてまとめます。

抽象クラスについて

今までは基本クラスである程度設計図を作り、派生クラスで少し変更を加える形ばかりを取っていましたが、基本クラスでなんの具体的なデータも入れずとりあえずの雛形だけ作って、派生クラスでその実装を行いたい場合も出てきます。そんな時は基本クラス内でabstractキーワードを使うことで抽象メソッドを作ることができます。そして抽象メソッドを含むクラスを抽象クラスと言います。

抽象クラスと抽象メソッドの例)

abstract class クラス名

{

    abstract 返すデータ型 メソッド名(パラメータリスト);

}

ちなみに派生クラスではこの抽象メソッドの中身を全て実装する必要があります。

f:id:covory10101101276:20171012110800p:imagef:id:covory10101101276:20171012110804p:imagef:id:covory10101101276:20171012110807p:image

長い文を書いてしまいましたが、要点は3〜11行目で、設けた抽象クラスを実装し、3つの数の最大公約数を求めるクラスを作ってみました。だいぶ無駄が多いプログラムだと思うのでどなたかご指摘お願いいたします😅😅今回はここまでにしておきます

 

この先にやるインターフェースという概念にとても似ているこの抽象クラス。これらの違いについても明確にして行こうと思います🙂🙃