yumeの日記: C#学習 6 6
コメントありがとうございます。
++C++;
●変数と式
・ほぼおさらい
・タプル(ダブルではない)。複数の変数を同時に宣言したり、まとめておけたりする。
>C++でpairとかあったね。この辺りは使いこなせていない。
・識別子名。プログラマが名前をつけられるものは識別子と呼ぶ。頭に@をつければ「for」とかでも名付けできる。他の言語と連携するときに使う。
●[雑記] 識別子名に使える文字
・変数名とかに、Unicodeの一部の文字クラスも使える(えっ)
>decimal おじさんの体重 = 66.5m; とかもありってこと? って試したらできた。
>でもまぁ、あえて使う必要もなさそう。2バイト文字で山ほど痛い目に遭ってきたし……。
●[雑記] C# ソースコードと Unicode
●組込み型
・組込み型とは、intとかstringとか、言語に最初から用意されている型のこと。
・整数型だけでも8種類もある。符号なしならマイナスが使えないけど使える範囲が倍。
>そんなに大きい数字を使うことは普通はなさそう。
・文字型。C#ではUnicodeが使われる。charは2バイトの数値(0~65535?)として扱われる。
・小数型。おさらい。
・論理値型。trueとfalse。
・文字列型。C#のstringは「charの配列」ではない。
・object型。任意の型の値を格納できる。
・規定値には0かnullが入っている。Mainメソッド内では、必ず明示的な初期化が必要。
●数値
・特に何も考えずに使えば、整数はint、小数点数はdoubleとして扱われている。
・0xから始まる数値は16進数リテラル。0bからなら2進数リテラル。
・数値リテラル内で、アンダースコア_を桁区切り変わりに使える。
●特殊な文字列リテラル
>ここまでに学習していない要素や単語が複数でて、ちょっと飲み込めない。
>『「書式指定」もできます』とあるが書式指定とはなんだろう。
var formatted = $"({12300:c}, {12300:n}, {12300,4:x})";
この例もよくわからない。{}の中に変数などが使えることはわかったが、12300:cとはなんだろう。
>一旦おいておく
Microsoft Learn 『C# を使用して .NET クラス ライブラリからメソッドを呼び出す』
●はじめに
●.NET クラス ライブラリの概要
・.NETクラスライブラリには、たくさんのメソッドが入ったたくさんのクラスがたくさんある。
・クラスを1つ読みだせば、そのクラスに関連するいろんなメソッドが使える。
・クラスの見つけ方。在職中に実際に使う、検索してブログとかを見つける、microsoftのドキュメントを読む。
>意外と泥臭いやり方だな……。
●.NET クラス ライブラリでのさまざまな種類のメソッドの呼び出し
Random dice = new Random(); //System.Randomクラスの新しいインスタンスを作り、dice変数に新しいオブジェクトへの参照を格納する。
int roll = dice.Next(1,7); //Next()メソッドを呼び出す。返り値は最小1~最大7。これをroll変数へ保存。
Console.WriteLine(roll); //出力。1~6の数字が出てくる。
・
>いまいちよくわからない。Random diceは int diceのようなもの? new Random() とは?
・ステートレスメソッド(静的メソッド)はメモリをいじったりせずに動作する。
・ステートフルメソッド(インスタンスメソッド)はアプリケーションの状態に依存する、または値を更新したりする。
・『クラスのインスタンスは、オブジェクトと呼ばれます』
>これも少し飲み込みづらい。いったんかみ砕いていくと。
・オブジェクトとは……クラスのインスタンス。
・クラスとは……いろいろな変数や計算が入ったやつ?
・インスタンスとは……??
>用語がちゃんと頭にはいっていない。
++C++;曰く:
・クラスとは、オブジェクトを作るための設計図。
>オブジェクトとは?
IT用語辞典 e-Words曰く:
・操作や処理の対象となる何らかの実体のこと。例えば操作画面のアイコンや、3DCGで空間に置いた立体。
>クリボーとかもオブジェクト?
・オブジェクトを定義する雛形をクラス(class)、クラスに基づいてプログラム実行時にコンピュータのメモリ上に展開されたオブジェクトのことをインスタンス(instance)と言うが、実際上はインスタンスのことを指してオブジェクトと呼ぶことも多い。
まとめると:
・クラスはオブジェクトの設計図
・オブジェクトは実際に作りたい何かの概念(アイコンとかクリボーとか)
・インスタンスは、実際に実行されているオブジェクト。実体化(インスタンス化)したオブジェクト
かな?
Learnに戻る。
Random dice = new Random();
・newでは、次の作業が行われる。
1.Randomクラス(設計図)に基づき、必要なメモリを確保。
2.オブジェクトが作成され、メモリアドレスで格納される。
3.そのアドレスを返して、dice変数に保存できるようにする。
・Next()メソッドはステートフルメソッドなので、クラスのインスタンスを作成する必要がある。
要点:
・メソッドを呼び出すには、「クラス名.メソッド名()」という形をとる。
・メソッドがステートフルの場合、まず「インスタンス」を作る必要がある。
・インスタンスを作るときは クラス名 変数名 = new クラス名;
●戻り値と入力パラメーターの操作
・メソッドには返り値と引数があったりなかったりする。
・オーバーロードされたメソッド。
>引数の数違いで複数のバージョンを同じメソッド名で作れるというやつ。
・実際どういうオーバーロードバージョンがあるのか、とかはオートコンプリートっぽい機能や検索を使う。
●課題 - System.Mathクラスのメソッドを使い、数値を比較して大きい方を返す。
doc.microsoftから「Math」クラスページを見ると、メソッド一覧が見える。まぁこの中で言えば明らかに「Max」だろうから、これを使う。
>機能から探したいとき、クラスすら不明なことも当然あると思うんだが、そういうときはどうするんだろう?
int firstValue = 500;
int secondValue = 600;
int largerValue = Math.Max(firstValue, secondValue);
Console.WriteLine(largerValue);
●知識チェック
・Q.オブジェクトとは何ですか? …… A.クラスのインスタンス。
>理解できたような、そうでないような……。
現時点での理解をまとめると
・メソッド(関数)はクラスに入っている。
・メソッドによっては、オブジェクト(インスタンス)を作る(=メモリ領域を確保する)必要がある。
・実際に作られたオブジェクト(インスタンス)は、それぞれが独立してメモリ領域を確保している。
>例えば、メソッドAは「引数から変数Aを引く」として、オブジェクトごとに変数Aに異なる値を確保していれば、同じメソッドでも異なるオブジェクトから呼び出すことで、異なる結果を返すとか?
例えばMonsterクラスというのがあって、引数は攻撃力だとして
Monster greenSlime = new Monster(10);
Monster redSlime = new Monster(50);
Attackメソッドは、各モンスターの攻撃力だけ引数から引いた値を返すとしたら
int hitPoint = 100;
hitPoint = greenSlime.Attack(hitPoint); // 90
hitPoint = redSlime.Attack(hitPoint); // 40
みたいな感じかな。
日本語な識別子 (スコア:1)
ウチは受託開発が主なので、
いにしえのエンドユーザープログラミング(お客様で使われていた内製ツール)で使われていたのであろうExcel VBA, Access VBAコード、識別子は当然のごとく日本語
→本職(弊社)に委託 …VB5, 6 あたりに移植される
→21世紀に入ってVB.Netに移植
→C#に移植
なんて出自を持つコードで、今でも日本語な識別子が生き残っていたりします。
新規案件でも、お客様の業務フローに直接由来する単語は妙な英語にするくらいならそのまんま日本語で付ける文化がまだ一部に残ってますね。
Re:日本語な識別子 (スコア:2)
昔趣味のプログラムで日本語関数名を使っみたけど、
* 微妙なニュアンスの違いが気になる
* どこがひらがなか漢字か迷う
とかで使わなくなりましたなぁ
読みやすい気もするんですけどね
Unicodeな識別子 (スコア:1)
ついでに。
Unicodeな識別子名を付けていると、言語のバージョンが上がって準拠するUnicodeバージョンが変更された際に、Unicodeの側で文字の扱いが変わったことによって識別子に使えなくなりコンパイルが通らなくなる、なんてことがあったりもします。
近年だと中黒(・)とか。
まあこれはUnicode側の問題なのですが。
今更感があるけれど。 (スコア:0)
++C++はC系の言語だとエラーになります。インクリやデクリが値に対して使えない。んてインクリやデクリが値を返すから。
書式指定とか (スコア:0)
{12300:c}
文字列挿入(文字列補間)の {} の中には、変数名だけを入れる以外に色々な書き方が有る。
・{変数名}
・{変数名:書式指定}
・{変数名,桁数指定}
・{変数名,桁数指定:書式指定}
変数名の所にはリテラルを直接書く事も出来るので、
{12300:c} は数値リテラル 12300 を 書式 c で文字列化するという意味になる。
c,n,xは数値の書式指定で、cは通貨、nはカンマ区切りの10進数、xは16進数、かな?(滅多に使わない…)
書式指定は↓なんかも参考になるかな。
https://programming.pc-note.net/csharp/string_format.html [pc-note.net]
カスタム数値書式指定の「#,0.%」を組み合わせた物はよく使ってる。
String.Format() も同様の指定が可能で、変数名の代わりに引数のインデックスを指定する。
・{インデックス}
・{インデックス:書式指定}
・{インデックス,桁数指定}
・{インデックス,桁数指定:書式指定}
例: String.Format("{0:c}", 12300);
クラス
設計書(クラス)を基にパソコン(オブジェクト)の現物(インスタンス)を作る、みたいな。
概念の説明って難しいよね。
個々のインスタンスごとに別々の状態を持つのはその通り。
クラスの見つけ方 (スコア:0)
慣れと言ってしまえばそれまでなんですが、名前空間(namespace)というもので体系的にまとめられているのである程度当たりが付きます。
例えば文字列の操作を行うクラスなら「System.Textの名前空間の中にありそうだな…」といった感じです。
VisualStudioでソースコードを打ち込んでいると、小さなウィンドウにクラスやメソッドの一覧が説明と一緒に表示されるのでその辺を手掛かりに探すと良いのではないかと思います。
機能すら分からないようなものはGoogleで検索です。
「このクラスにどういったメソッドがあるんだろう?」といったものを調べたい場合は、調べたいクラスやメソッドにキャレットがある状態でキーボードのF12または右クリックして「定義へ移動」とすると、そのクラスやメソッドの定義が表示されるのでそこから参照するのが効率が良いと思います。