C#

オブジェクト初期化子はやっぱ便利

C#

以前、オブジェクト初期化子について勉強しましたが、その時は何が便利なのかいまいちわかりませんでした。しかしいくつかのプログラムを書いてる内に、なるほどこれは便利だと思うようになりました。 using System; class Class { public string Name; } cl…

outキーワードによる出力引数

C#

参照渡し - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 初期化して無い変数を関数等に渡そうとするとコンパイルエラーがでます。 using System; class CClass { public string str; } class Program { static void Foo(CClass cobj) { cobj = ne…

refキーワードによる参照渡し

C#

参照渡し - C# によるプログラミング入門 | ++C++; // 未確認飛行 C refキーワードを使えば値型でも参照で渡すことができます。 using System; class Program { // refキーワードを付ける static void Foo(ref int i) { i = 9999; } static void Main() { in…

ジェネリクス定義

C#

ジェネリック - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 今までも何度も出てきたあれですね。C++でいうテンプレートです。兎にも角にも定義してみましょう。 using System; // ジェネリクスクラス定義 class CClass<T> { public T member; } cla</t>…

拡張メソッド

C#

拡張メソッド - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 静的メソッドをオブジェクトのメソッドと同じ形式で呼び出せるようにできるものらしいです。まずは普通に書いた場合の処理を見てみます。 using System; class CClass { public string…

partialキーワードでクラスの分割定義

C#

クラス - C# によるプログラミング入門 | ++C++; // 未確認飛行 C partialキーワードを使えばクラス定義を分割することができます。 using System; // partialでクラスの分割定義 partial class CClass { static public void Foo () { Console.WriteLine( "F…

名前空間のエイリアス

C#

名前空間 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C usingキーワードを使って名前空間のエイリアスを定義することができます。 // SystemのエイリアスとしてSを定義 using S = System; class Program { static void Main() { // S経由でアク…

匿名型

C#

型推論と匿名型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 名前の無いクラスって感じですかね。 using System; class Program { static void Main() { var x = new { Foo = "foo", Bar = "bar" }; Console.WriteLine( x.Foo + x.Bar ); } } $…

オーバーフローのチェック

C#

オーバーフローのチェック - C# によるプログラミング入門 | ++C++; // 未確認飛行 C checkedキーワードを使えばオーバーフローが発生した場合に例外を投げることができます。 using System; class Program { static void Main() { byte b = 255; // バイト…

null合体演算子

C#

組込み演算子 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 対象の変数がnullだったら初期値を入れるという処理を書くための演算子です。三項演算子の特殊省略形のような感じですね。ということでまずは三項演算子を使った場合の処理を確認して…

変数宣言時の既定値

C#

組込み型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C defaultを使うと、変数宣言時に初期化しなかった場合の既定値を明示的に取得することができます。 using System; class Program { static void Main() { // 以下二つは同じ意味になる int …

逐語的文字列リテラル(ヒアドキュメント)

C#

組込み型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 文字列リテラルを定義する際に先頭に「@」を付けると、見たままの文字列として扱えます。つまりエスケープシーケンス等の解釈がされません。また複数行にまたがって文字列を定義できます。…

逐語的識別子

C#

変数と式 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 変数を宣言する時に変数名の先頭に「@」をつけるとC#のキーワード名と同名の変数でも宣言することが可能となります。例えばthisを変数名として使う場合、通常なら以下のエラーがでます。 u…

dynamicによる動的型付け変数

C#

変数と式 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C dynamic - C# によるプログラミング入門 | ++C++; // 未確認飛行 C これは凄い機能ですね。変数の型をコンパイル時ではなく実行時に決めるようにする変数です。 using System; class CClas…

varによる型推論

C#

変数と式 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 変数を宣言するときにvarを使うと、右辺値から判断して適切な型を設定してくれます。 using System; class CClass {} class Program { static void Main() { var i = 1; // int型 var d = …

C#によるプログラミング入門

C#

プログラミングC# 第6版でずっと勉強を進めてたわけですが、どうも細かいところの言語仕様が省かれているようなので一旦下記サイトで基礎のおさらいをしようとおもいます。C# によるプログラミング入門 | ++C++; // 未確認飛行 C

Listによる配列操作

C#

プログラミングC# 第6版 7.2 Listが出てきました。これまでも何度か登場していましたね。通常の配列では配列の要素数が固定されてしまうという問題がありましたが、Listを使うと内部で配列の拡張を自動でやってくれる優れものです。というわけで動作確認して…

ジャグ配列と四角形配列

C#

プログラミングC# 第6版 7.1.4 多次元配列は二種類の定義方法があります。まずはジャグ配列(配列の配列)と言って配列の要素の配列を任意の数の配列で定義することができます。以下、動作確認です。 using System; class Program { static void Main () { i…

配列とはArray型を基底クラスに持つオブジェクトである

C#

プログラミングC# 第6版 7.1.3 なるほど。配列の正体とはArray型を基底クラスとしたオブジェクトだったんですね。なのでさまざまなメソッド等を持っているということみたいです。例えば配列の中の偶数だけを取ってくる処理が書く場合 using System; class Pr…

paramsキーワードによる配列引数の簡略化

C#

プログラミングC# 第6版 7.1.1.1 これは凄い仕様ですね。一見するとCの可変長引数みたいに見えますが、関数の受け取り側で配列になってくれると言う点でかなり違います。兎にも角にも動作確認してみます。 using System; class Program { // paramsキーワー…

配列の初期化のテクニック

C#

プログラミングC# 第6版 7.1.1 ちょっと第6章の例外の話は一旦飛ばします。ってことで第7章、配列の話ですね。配列の初期化は以下のようにできます。 using System; class Program { static void Main () { string[] strs = new string[] { "foo", "bar", };…

デリゲート型の変数に関数を複数登録する

C#

プログラミングC# 第6版を読んでいて気付いたんですが、「+=」での関数登録は何もイベントだけの特殊機能ではないんですね。その辺詳しく書いてなかったので今まで勘違いしていました。 using System; delegate void CDelegate (); class Program { static v…

イベントの処理順は保障されていない

C#

プログラミングC# 第6版 5.8 追加した順序と同じ順序でイベントハンドラが実行されていることに気付かれたかもしれません。しかし常に順序が同じになることは保障されていないので、この挙動に依存したコードを作成してはいけません。 なるほど、つまり以下…

独自のイベント引数を作る

C#

プログラミングC# 第6版 5.8 イベントの続きです。前回キャンセル用のイベント引数CancelEventArgsについて勉強しましたが、このイベント引数は独自に定義することもできます。というわけでCancelEventArgsと同じくCancelを持つ独自のイベント引数を作ってみ…

イベントをキャンセルさせるCancelEventArgs

C#

プログラミングC# 第6版 5.8 イベント処理を途中でキャンセルさせる方法ですね。 using System; using System.ComponentModel; // CancelEventArgsのために必要 class CClass { // CancelEventArgsを使うためにジェネリックにする public event EventHandler<CancelEventArgs></canceleventargs>…

初めてのイベント

C#

プログラミングC# 第6版 5.8 またまた難しそうな話ですねぇ。ってことでイベントです。要するに予め関数に対してここに処理を割り込ませることができますよ、と宣言しておいて、後からさまざまな処理を割り込ますことができる、と。こんな感じですかねぇ。兎…

クロージャでデリゲート

C#

プログラミングC# 第6版 5.7 これもデリゲートがらみですね。クロージャ、と何やら新しい名称が出てきました。匿名メソッド内で外部で定義された変数を使用することで、その変数が匿名メソッドが存在する間ずっと参照可能な状態のことを言うそうです。言葉だ…

Funcでデリゲート

C#

プログラミングC# 第6版 5.7 まだまだ続きますよ!デリゲートの話です。Funcというのがでてきました。これは戻り値がTResult型で引数がT型のデリゲートのことです。つまり今まで出てきたActionやPredicateはこのFuncで表せることになります・・・・・、って…

ラムダ式でデリゲート

C#

プログラミングC# 第6版 5.5 匿名メソッドでデリゲートの続きですね。 using System; public delegate int CDelegate (int i); class Program { static void Main () { CDelegate dobj = (int i) => { return i + 1; }; Console.WriteLine( dobj(1) ); } } $…

匿名メソッドでデリゲート

C#

プログラミングC# 第6版 5.4 またも引き続きデリゲートの話です。匿名メソッドというものが出てきました。関数名を持たない関数のことのようです。つまり匿名メソッドを定義してデリゲート型の変数に代入した場合、その変数以外から匿名メソッドにアクセスす…