モチベーションも大事だと思うので覚書として使用します。
三週目の感想
まだ早いけど一ヶ月経って感じたのは、思ったよりプログラミング楽しいという事です。 理解が深まる程新鮮な発見が増えるし、何より最新の技術に触れられていられるのは楽しいです。 ただのめり込み過ぎず、やりたい事に対するツールという事を頭において学習したいと思いました。 他、ご指導頂いた所の修正をしたり、いくら覚書でもC#を1つの投稿に収めるのは現実的ではないので、 新しい学習項目は成果として、編集でなく投稿していこうと思います。 (識別子ならユーザー定義型のあたりに書き込みたいといった関連性は犠牲になるけど…) 今日余った1日でスコープとenum学習。また、極力見やすく書けるといいなーと思いました。
#スコープ {識別子を囲うブロック}
{}の範囲内の変数や関数は通常、識別子だけで参照できる
(=見える=依存性ある=スコープ内)private
{}の範囲外の変数は関数は通常、識別子だけで参照できない
(=見えない=依存性ない=スコープ外)public
##例. 識別子のスコープ
(同じブロック内は識別子重複NG。呼出は引数を値渡し・参照渡しで)
using System;
class ByReferenceTest
{
static void Main()
{
int a = 100;
Console.Write("{0} → ", a);// 100 (ref無し)値渡しではstatic関数内でのみ換わる//100.10
Test(ref a);
Console.Write("{0}\n", a);// 10
}
static void Test(ref int a)// (ref)参照情報を渡せばMainメソッドの識別子の値も変換できる//10.100→10
{
a = 10;
}
}
##例外. メンバ変数とローカル変数
(メンバ変数(Field)とローカル変数{入れ子}は同じ名前OK、逆に同じブロック内はNG)
public class Sample
{
int x = 20;// Field(メンバ変数)
public void M()
{
int x = 10;//public void M()(ローカル関数、入れ子)
Console.WriteLine(x); // ローカル変数の方の x = 10(あとから書いたのでローカル優先)
Console.WriteLine(this.x); // フィールドの方の x = 20(参照必要this.~)
}
}
#列挙型enum
0から複数の定数を割り当てて列挙できる。
通常、列挙型は名前空間内に直接定義して、名前空間内のすべてのクラスが共通の利便性でアクセスできるようにするのが最も適切です。
(enumの定数はグローバルに属するからスコープ内の定数重複はエラー。
そのためclassやnamespaceでわけて定義すべき)
基になる型は、列挙子ごとに割り当てるストレージの大きさを指定します。 ただし、 enum 型を整数型に変換するには、明示的なキャストが必要です。
(型名は範囲の事で既定intなので十分大きい。
またenum型を整数型として扱いたい場合キャストで変換int x = (int)Day.Sun;
##例. キャストで変換
enum 列挙名:型名{列挙子リスト};// 型名intが既定
enum WcScoreRank{Honda, Inui, Okazaki};// Pascal
既定値オーバーライド可能。{Honda=1, Inui, Okazaki}
public class WcTopScorersJP
{
enum Rank { Honda, Inui, Okazaki, Kagawa, Osako, Haraguti };
// global属性なので重複注意(namespaceで分ければ理想)
static void Main()
{
int x = (int)Rank.Honda;// 'キャスト'しないとエラー
int y = (int)Rank.Osako;
Console.WriteLine($"Honda = {x}");// Honda = 0
Console.WriteLine($"Osako = {y}");// Osako = 4
}
}