投稿

5月, 2020の投稿を表示しています

セッターとゲッターは必要なのか?

セッターとゲッターの必要性 セッターとゲッターは必要か? そもそもセッターとゲッターとは? プログラミングを始めるとそのうち「 セッター と ゲッター 」という言葉を耳にすると思います。 セッターとゲッターとは、オブジェクト指向で使うメソッドで、そのクラス内の変数(フィールド)に値を代入したり、参照するためのメソッドとなります。 実際、この説明を聞いて、 「セッターとゲッター使わなくても代入参照できるよね?」 と思った人もいると思います。 そうなんです。セッターやゲッターを実装しなくても、変数に代入や参照はできます!! C#で書くと以下のようなコードになります。 class Test { public static void Main( string[] args ) { A a = new A(); a.number = 10; System.Console.WriteLine( "number=" + a.number ); } } class A { int number = 0; } 実行すると、「 number=10 」と表示されます。 「 A a = new A(); 」でAクラスをインスタンス化し、「 a.number=10 」でAクラスの変数 number に10を代入しています。 そして、「 a.number 」でAクラスのnumberの値を参照します。 このように、セッターやゲッターを使用しなくても、インスタンスの変数を操作することは可能です。 しかし、このままだとセキュリティ的に問題があります。「 a.number 」に代入する際に自分の好きな値を格納することが可能なのです。 開発者の意図しない値を代入されてしまうと、プログラムが正常に動作しないとき

C#で行列計算プログラムを作成(基本計算と行列表示メソッド)

自作行列計算クラス C#で行列計算プログラムを作成 はじめに 今回は、 自作の行列計算クラス の説明を行います。 私は一応大学で数学を学んでいたこともあり、学生時代に行列計算のプログラムを作成したことがありました。 どのプログラミング言語でも 行列計算 のライブラリは存在すると思います。しかし、自分でコードを書くことに意味があると思うので今回はメソッドとして作成を行っていきたいと思います。 NumPyでよくね って思った人。その通りだと思いますが、私は NumPy には負けない(?) 作成自体は終わっているので、解説を書いていく感じになります。ちなみに言語は C# です。 今回のコードは こちら 行列の足し算、引き算 まずは、簡単なところから作成します。足し算です。 行列は 2次元配列 で表すので、引数は double型の2次元配列 を2つ指定します。計算した結果も行列を返すので、戻り値は double型の2次元配列 となります。 行列の足し算の仕組みは以下のようになっています。 1 2 3 4 + 5 6 7 8

参照渡しと値渡し、引数には注意が必要!?

イメージ
参照渡しと値渡し 参照渡しと値渡し 引数には注意が必要 前回 、プリミティブ型とクラス型についてまとめました。 内容としては、変数であっても プリミティブ型の変数 と クラス型の変数 によってデータの格納の仕方が異なるため、比較を行うときには注意が必要である。というものです。 今回の内容は、この プリミティブ型の変数 と クラス型の変数 には比較以外に 引数 でも注意が必要となります。 私もこの引数で注意を怠り謎の不具合が出たことがあります。これはプログラミングに慣れてきたころに起こるミスだと思います。 参照渡しと値渡しとは プリミティブ型は 箱のイメージ なのに対して、クラス型は データの場所 を格納します。そのため引数でデータを渡すときにも、データの値を直接渡すのか、データの場所を渡すのか変わってきます。 値渡し プリミティブ型 を引数とした時には、この 値渡し となります。 これは、引数に与えられたデータをコピーして、メソッド内で使う変数と、引数に渡した変数は 別物 として扱われます。 そのためメソッド内で引数の変数の値を変えても、もとの変数の値は変わりません。 参照渡し クラス型 を引数とした時には、この 参照渡し となります。 これは、もとの変数のデータの場所を引数の変数に渡します。そのためメソッド内で引数の変数の値を変えると、メソッドを抜けた後のもとの変数の値も変わったままになります。 では、以下のコードを実行してみましょう。 class Test { public static void main( String[] args ) { int

なぜJavaで「==」で文字列比較できないのか

プリミティブ型とクラス型 プリミティブ型とクラス型について はじめに 今回は「プリミティブ型とクラス型」についてまとめたいと思います。 なぜこの内容を選んだのかというと、昔Javaを書いている時に なぜJava文字列比較で「 == 」を使えないのか? という疑問が生まれたのです。これが最近、研修を受けることによって復活したためです。 当時はまだプログラミングを始めたばかりということで「 できないんだー 」くらいにしか思っていませんでした。そして年数を重ね、だいぶ分かるようになってきたところでJavaの研修で再び「文字列比較に「==」は使えない」と学んだ。 説明はされたが、気になったので調べようと思います。 「==」が使えないのか確認 では、なぜ「 == 」での比較ができないのでしょうか。変数として使っている int や double では当たり前のように「 == 」を使うことができます。同じ変数のなら使えるはず、、、 実際、「 == 」を使ってコードを書いてもコンパイルエラーにはなりません。そう、「 == 」が使えないわけではないのです。ためしに以下のコードを書いて実験してみましょうか。 String a = "abc"; String b = "abc"; if( a == b ) { System.out.println( "同じ" ); } else { System.oiu.println( "違う" ); } これを実行すると、「 同じ 」と出力されたはずです。ちゃんと比較できていますね!! では次にコードを書き換えてみましょう。 String a = "abc"; String b = "ab"; b += "c"; if( a == b ) {

VisualStudioとEclipseどっちがオススメ?

VisualStudio VS Eclipse VisualStudio VS Eclipse はじめに 私はC#をメインで使っているため VisualStudio を多く使っています。しかし、最近はJavaの研修があるため Eclipse も使うようになりました。 実際、 IDE はそこそこ容量をとるので何個もインストールするのに抵抗がある人や、プログラミング言語をどれにしようか悩んでいる人はいると思います。 私は、2つを同時に使っているため、それぞれの 私的な 長所と短所が色々見えてきました。なので今回は「 VisualStudio VS Eclipse 」についてまとめようと思います。 VisualStudioについて VisualStudioはマイクロソフトが開発しているIDEです。 C++ や C# 、 F# などがサポートされています。 XamarinとC#を使用し、スマートフォンアプリの開発ができます。ビルドはできませんが iosアプリ の作成もできます。 いいところ 変数の予測変換がある クラス、メソッドなどの予測変換はどのIDEにもあるのですが、自分が作成した変数まで予測してくれるのは少ないと思います。変数を使用する機会が多いときには助かりますね。 Xamarinでマルチプラットフォーム作成 Xamarin.formsを使用することで、Androidやios、デスクトップのアプリをC#を使い、同時に作成する事ができます。プラットフォームごとに開発の環境を作らなくてよいのは助かります。

Androidでドラッグアンドドロップ機能の実装

Androidでドラックアンドドロップ Androidでドラックアンドドロップ ドラックアンドドロップとは ドラックアンドドロップとは、アイコンなどを選択し、別の場所に移動させるときに使います。移動している時にアイコンも一緒に動きます。 スマホの場合は、指でタップしたまま移したい場所まで指をスライドさせます。これが実装できるとより直観的に操作することが可能になります。 前提条件 言語は C# で VisualStudio を使用しています。 今回は画面を XML ではなく、 Viewクラスを継承したファイル で作成していきます。 ちょっと特殊なつくり方だと思いますが、画像や矩形などの描画が座標指定で描画できるため私はゲーム作成で使っています。 画面の描画は XML のときと同じく SetContentView で呼び出すことができます。事前にインスタンス化しておく必要はありますが、、、 SetContentView で呼び出すと Drawメソッド が呼ばれ、画面が描画されます。 はたしてこの方法で描画している人がいるのかどうか。。。(笑) 実装方法 先ほど説明しましたが、画面の描画は SetContentView で呼び出します。これを定期的に呼び出したいので、 Timerクラス を作成し、そこに記述します。 しかし、単純にTimerクラスで描画しようとしても描画されずに止まってしまうことがあります。そのため、Timerの処理を以下のように記述します。 private Timer timer1; timer = new Timer { Enabled = true; AutoReset = true; Interval = 250; }; timer1.Elapsed += delegate { timer1.stop(); this.RunOnUiThread( ()

for文にGetLengthはキケン?

イメージ
for文の条件式 for文の条件式 条件式は何使う? 今回なぜこのテーマにしたのかというと、前回「 多次元配列とfor文 」についてまとめたのですが、6種類の3重ループを作成しました。このとき配列の要素数を変えるたびに 6×3=18 箇所の修正を行うのは大変です。そのため for文 の条件式を「 x.GetLength() 」を使って実行しようと思ったのですが、条件式を 数字 から GetLength に変更したとたん急に処理時間が長くなってしまったのです。 ということ今回は「 for文の条件式 」についてまとめみようと思います。 処理時間の差は? それでは、条件式が 数字のfor文 と メソッドのfor文 の2種類のコードを作成し、速度に差が出るのか調べてみようと思います。 処理するものは前回に引き続き 行列の積 にします。 for(int i=0;i<n;i++) { for(int w=0;w<n;w++) { for(int v=0;v<n;v++) { data[i,w] += x[i,w] * x[w,v]; } } } 上記コードの n の部分を 数字 と メソッド に変更します。 配列は 1000×1000 です。 数字のfor文 for(int i=0;i<1000;i++) { for(int w=0;w<1000;w++) { for(int v=0;v<1000;v++) { data[i,w] += x[i,w] * x[w,v]; } } }

多次元配列とfor文

イメージ
多次元配列とfor文 多次元配列とfor文 多次元配列とは 配列には2種類存在し、 直線のような一次元配列 と 表のような多次元配列 があります。 多次元配列では以下の表のように 行(x) と 列(y) が存在し、2種類の値を使って多次元配列から値を取り出します。 多次元配列のアクセス順番 先程、多次元配列を表のように表しましたが、実際のメモリ上では以下のようになっているらしいです。 そのため、呼び出す順番を間違えると処理の速度に差が出てきます。 これを確かめるために、今回は 行列の積 を使って実験をしてみようと思います。 ここで行列の積を説明するのは大変なので、今回は省略します。行列の積を求める計算は以下のように3重ループを組みます。 for(int i=0;i<n;i++) { for(int w=0;w<n;w++) { for(int v=0;v<n;v++) { data3[i,w] += data1[i,w] * data2[w,v]; } } } 今回行う実験ではこの「 i 」と「 w 」、「 v 」の場所を変えて処理の速度にどのくらいの差が出るかを調べます。 ちなみに、 この3つの変数の順番を変えても行列の積の値は変わりません。 コードは長くなってしまうため省略しますが、3重ループを開始したときから、すべてのループを抜けたときまでの処理時間を測定します。 以下の図が実験の結果です。 どうですか、かなり差が出ていますね。今回の実験では 2000×2000の行列 で計測しました。 一番時間が短いのは以下のコードです。 for(int i=0;i<n;i++) { for(int w=0;w&

初めてのC#③

初心者のC# 初めてのC# 第3回 みなさんこんにちは! 初めてのC#第3回 です。第2回は こちら 今回は前回に引き続き、繰り返し②から配列、メソッドを扱います。 この部分ができるようになると中級者に近づけます。是非サンプルコードを使って練習してみてください。 目次 初級編~繰り返し②~ 初級編~配列~ 初級編~メソッド~ 初級編~繰り返し②~ 前回の繰り返しは for でしたが、今回は while を勉強していきます。 for は回数を指定して繰り返し処理を実装しましたが、 while は条件を設定し、その条件が満たされている間繰り返しを行います。 コードは次のように記述します。 public class Sample3 { public static void Main(b string[] args ) { int count = 0; while(count < 5) { System.Console.WriteLine( "count = " + count ); count++; } } } 実行すると、 count = 0; count = 1; count = 2; count = 3; count = 4; このように表示されたはずです。 while は () の条件が true のとき、 {} の中に記述した内容を実行し、これを繰り返します。 for と while の使い分けは大まかにまとめると次のようになります。