C#

Predicateでデリゲート

C#

プログラミングC# 第6版 5.3 引き続きデリゲートの話です。Predicateとは戻り値がbool型で引数がT型のデリゲートとのことです。使い方としてはActionとほぼ同じなんですが一応確認しておきます。 using System; class Program { public static bool Foo (int…

Actionでデリゲート

C#

プログラミングC# 第6版 5.2 引き続きデリゲートの話です。Actionというのはジェネリック型というものらしいです。今まででも既にListとか登場してましたね。でActionを使ってデリゲートとのことなんですが、まずジェネリックについて先に説明してくれないん…

オブジェクトメソッドでもデリゲート

C#

プログラミングC# 第6版 5.1 前回の記事で関数をデリゲートで呼ぶ処理を勉強しましたが、関数だけでなくオブジェクトのメソッドすらもデリゲートとして登録することができます。 using System; delegate void CDelegateClass (int i); class Hoge { public s…

機能が同じなら一緒に扱え、デリゲートによる関数合成

C#

プログラミングC# 第6版 5.1 デリゲートというものが出てきました。本では長々と説明があったのですが、要するにC++でいうところの関数ポインタってところですね。否。その認識は間違いです。確かに関数ポインタに似てるんですが、実際はちょっと違います。…

abstractに似てる?interfaceとabstractの違いの話

C#

プログラミングC# 第6版 4.10 interfaceの話がでてきました。これは一見するとabstractに非常によく似ています。 using System; // インターフェイス interface IClass { // 派生側でFooを実装することを強制する void Foo (); } class CClass : IClass { pu…

実行時の型を確認する方法

C#

プログラミングC# 第6版 4.12 実行時に型を取得する方法です。これは例えば色々なクラスを一旦object型の配列に格納した後に、そこから元の型に戻して処理を実行させる時などに使えます。 using System; class CClassA { public void Foo () { Console.Write…

すべての型はObjectから派生している

C#

プログラミングC# 第6版 4.8 なんと全ての型は暗黙のうちにobject型から派生しているそうです。 class CClass { } class Program { static void Main () { // objectから派生しているので代入できる object cobj = new CClass(); } } しかもintのようなデー…

オーバーライドされた基底クラスのメソッドの呼び出し方

C#

プログラミングC# 第6版 4.5 メソッドを派生クラスでオーバーライドした時に、基底クラスのオーバーライドされたメソッドをどうやって呼び出すかという話。 using System; class CBase { public virtual void Foo () { Console.WriteLine("CBase.Foo"); } } …

internalアクセス修飾子

C#

C++にもあるアクセス修飾子ですが、C#にはprivate,public,protectedの他にinternalというアクセス修飾子があります。同一プロジェクト内でだけアクセスのできる修飾子みたいです。どういうことかというと、同一プロジェクト内であればpublicとまったく同じと…

virtualとoverrideによるメソッドの上書き

C#

プログラミングC# 第6版 4.3.2 さてここもC++経験者は注意が必要です。virtualの動作がC++とC#で少し違います。まずは以下の例を確認してみます。 using System; class CBase { // 基底クラスのメソッドにvirtualをつける public virtual void Foo () { Cons…

継承とnewキーワード

C#

プログラミングC# 第6版 4.3.1 継承の仕方はC++とほぼ変わらないですね。ひとつC++とは違い、注意する点がありました。以下のコードです。 using System; class CBase { public void Foo () { Console.WriteLine("CBase.Foo"); } } class CClass : CBase { p…

オブジェクト初期化子

C#

プログラミングC# 第6版 3.7 オブジェクト生成時に生成側でオブジェクトの初期化のための処理を行うことができるというものみたいです。 using System; class CSample { public int foo; public int bar; } class Program { static void Main () { // オブジ…

オプション引数と名前付き引数

C#

プログラミングC# 第6版 3.6.1 メソッドの引数はオプション引数にすることができます using System; class CSample { public void Foo (int i, int j=1, int k=2) { Console.WriteLine(i+j+k); } } class Program { static void Main () { CSample cobj = ne…

抽象基底クラス、abstract

C#

プログラミングC# 第6版 4.7 class宣言をするときにabstractをつけると、派生してからじゃないとオブジェクトが生成できないようになります。 using System; // abstractをつける abstract class CClass { } class Program { static void Main () { CClass c…

派生を断固許さない。それがsealed

C#

プログラミングC# 第6版 4.6 「派生を禁ずる!」まるでヒョウが言いそうな台詞ですね。とまぁそれはさておき、classを宣言するときにsealedとつけると、そのクラスから派生クラスを禁じることができます。 // sealedをつける sealed class CBase { } class C…

decimal型、10進浮動小数点数

C#

プログラミングC# 第6版 2.5.1.3 floatやdoubleは内部表現では2進数が使われているらしいのですが、このdecimalは10進数が使われているとのこと。そうすることによって精度の良い小数点を表現できるらしいです。C++にはこういった型はありませんでしたね。

Int32

C#

プログラミングC# 第6版 2.5.1 たとえばintにはInt32といった別名の型があらかじめ定義されているらしい class Program { static void Main() { int i = 10; System.Int32 j = 20; } } 好みで使い分ければいいんだろうか

usingとnamespace

C#

プログラミングC# 第6版 2.2 usingとnamespaceの話がありました。ここらへんはC++とほぼおなじですね。 using System; namespace HelloWorld { class Program { static void Main() { // usingしてるのでSystem.を省略できる Console.WriteLine("Hello, Worl…

お決まりのHelloWorld

C#

プログラミングC# 第6版 1章 新しい言語の勉強を始めるにあたって、必ずやる処理。それがHello Worldの表示ですね。 class Program { static void Main() { System.Console.WriteLine("Hello, World!"); } } コンパイルはVisual Studioが入ってるのでcscとい…

プログラミングC#第6版

C#

ちょっとひょんなことからC#を学ぶことになりました。プログラミングC# 第6版作者: Ian Griffiths,Matthew Adams,Jesse Liberty,鈴木幸敏,首藤一幸,株式会社情報技研出版社/メーカー: オライリージャパン発売日: 2011/11/29メディア: 大型本購入: 2人 クリッ…

値型でのコンストラクタ内でのプロパティの初期化

C#

プログラミングC# 第6版 3.4 class CSample { public CSample (int i) { foo = i; } public int foo { get; set; } } 上記クラス定義は極々普通の定義ですが、これを参照型(class)から値型(struct)に変えるとコンパイルエラーが出ます。 $ csc main.cs Micro…

コンストラクタから別のコンストラクタを呼ぶ方法

C#

プログラミングC# 第6版 3.4 using System; class CSample { public CSample (int i,int j) { foo = i; bar = j; } public CSample (int i) { foo = i; bar = 2; } public int foo; public int bar; } たとえば上記のようなコンストラクタが二つあったとしま…

値型と参照型

C#

プログラミングC# 第6版 3.4 ここはC++を勉強した人は注意が必要ですね。newはメモリの確保でポインタだ!みたいな固定概念を持ってるとC#では躓くと思います。まず参照型というのがどういうものが確認してみましょう。 using System; class CSample { publi…

列挙型でちょっとビックリ

C#

プログラミングC# 第6版 3.3 列挙型の話。これはC++とまったく同じですね。ってことでサクっと実行してみたところ・・・ using System; enum Hoge { Foo, Bar, Baz, } class Program { static void Main () { Console.WriteLine(Hoge.Foo); Console.WriteLin…

読み取り専用なフィールドを生成する(const VS readonly)

C#

プログラミングC# 第6版 3.2.6 constを使うと書き換え不可な読み取り専用フィールドを生成することができます。これはC++でも同じですね。 class CSample { public const int foo = 1; } 一方readonlyを使っても読み取り専用フィールドを生成することができ…

フィールドという名のメンバ変数

C#

プログラミングC# 第6版 3.2.4 フィールドと言う単語が出てきました。これはいったいなんのことでしょうか? using System; class CSample { // これがフィールド int foo; } 初めてのクラス実装のときにもう既に書いてましたね、これがフィールドだそうです…

get,setアクセサに独自の処理を実装する

C#

プログラミングC# 第6版 3.2.3 アクセサには独自の処理を実装することが可能なようです。 using System; class CSample { public CSample (double val) { foo = val; } public double foo; public double bar { get { return foo * 2; } set { foo = value /…

コンストラクタ

C#

プログラミングC# 第6版 3.2.3 クラス名と同じ名称でメソッドを作るとコンストラクタになります。 using System; class CSample { public CSample (string strval) { str = strval; } public string str { get; private set; } } class Program { static voi…

初めてのクラス実装

C#

プログラミングC# 第6版 3.2 ようやくクラスの話に来ました。まずはシンプルなクラスを定義してみます。 using System; class CSample { public string str { get; set; } } class Program { static void Main () { CSample obj = new CSample(); obj.str = …

foreachステートメント

C#

プログラミングC# 第6版 2.8.1 C#にはループ制御としてforやwhileの他にforeachというものがあります。これは配列をループさせるのに使用します。 using System; class Program { static void Main() { int[] array = {2,4,6,8}; foreach(int i in array){ C…