LotosLabo

プログラミング技術とか気になった情報を載せていきます

C#について2

配列

★配列型

型名[] 変数名;

★配列の作成

配列型変数 = new 型名[配列の長さ];


例:

int [] a = new int[5];
//長さが5の整数型配列を用意



★配列の初期化


型名 変数名 = new 型名 {値1,値2,・・・};


int a = new int {1,2,3,4,5};
int a = {1,2,3,4,5};  こっちでもいい


暗黙型付け配列
var a = new {1,2,3,4,5};


多次元配列


型名[,] 変数名 2次元配列
型名[,,] 変数名 3次元配列

変数名 = new 型名[長さ1,長さ2]; 2次元配列
変数名 = new 型名[長さ1,長さ2,長さ3]; 3次元配列


例:

int[,] a = new int[,]{{1,2},{2,1},{0,1}};


多次元配列の利点
・初期化が楽
・無駄にメモリ使わない
・動作が高速


配列の配列

int [][] a = new int[][]{
 new int[]{1,2},
 new int[]{3,1},
 new int[]{2,1}
};


関数定義


型名 関数名(型名 変数名)
{
}


呼び出し →  変数 = 関数名(入力)


列挙型


例として、曜日は7つの値しか取らない。英語との月は12個の値しか取らないような要素を使う。


enum 列挙型名
{
メンバー1、メンバー2、メンバー3
}

列挙型の利用 →  列挙型名.メンバー名


構造体

名前と年齢と住所などをまとめて管理しやすくする型

struct 構造体名
{
構造体のメンバー
}

例:

struct Person
{
  public string name;    // 名前
  public uint   age;     // 年齢
  public string address; // 住所
}





例外処理

想定外のものが来ないものと仮定するプログラム

★throw

例外が起こったことを利用側に知らせる。


例:

throw new FormatExeption();

★try-catch-finally


try
{
例外が投げられる可能性のあるコード
}
catch(例外の種類)
{
例外処理コード
}
finally
{
例外発生の有無にかかわらず実行したいコード
}

例:

static void Main()
{
  try
  {
    Console.Write("{0}\n", StringToInt("12345"));
    Console.Write("{0}\n", StringToInt("12a45"));
    //↑ ここで FormatException 例外が投げられる。
  }
  catch(FormatException)
  {
    Console.Write("想定外の文字列が入力されました");
  }
}

利点:
・正常動作部と例外処理部の区別が明確になる
・関数利用側に例外処理させることを強制できる
・例外処理部や、正常・例外問わず必ず実行する必要なある部分が一箇所にまとまる




オブジェクト指向が何かについての説明は省略させていただきます。

★クラスの定義

class クラス名
{
クラスの実装
}

★クラスの利用

クラス名 変数名;

インスタンスを作成

変数 = new クラス名();

★関数の利用

変数名.メンバー名


コンストラクタ

インスタンスを正しく初期化するための特別なメソッド


class SampleClass
{
SampleClass() ←これがコンストラクタ
{
初期化用
}
}

アクセスレベル


public       どこからでもアクセス可能
protected     クラス内部と、派生クラスの内部からのみアクセス可能
internal      同一プロジェクト内のクラスからのみアクセス可能
protected     同一プロジェクト内のクラス内部、または派生クラスの内部からのみアクセス可能
private      クラス内部からのみアクセス可能


●静的変数の使いかた


static 型名 変数名

クラスごとに唯一の実態を持ち、すべてのインスタンスの間で共有できる。



演算子オーバーロード

ユーザー定義型をあたかも組み込み型であるかのように扱えるようにするためのもの。

特徴:

組み込み型とユーザー定義型の区別をなくし、ユーザー定義型にも組み込み型と同じように+や-などの演算子が定義できる。


オーバーロード方法

public static 戻り値の型 operator演算子 (引数リスト)


インデクサー

ユーザー定義型が配列型と同様に[]を用いた要素の読み書きが行えるようにインデクサーという仕組みが用意されている。ユーザー定義型のオブジェクトでも、配列と同じようなa[i]という形での
要素の読み書きができるようになる。

アクセスレベル 戻り値の型 this[添字の型 添字]
{
set
{
値の変更時の処理を書く。
}
get
{
値の取得時の処理を書く。
}
}


継承

クラスから性質を受け継いだ新しいクラスを作ること。


class 派生クラス名 : 基底クラス名
{
派生クラスの定義
}

多態性


同じメソッド呼び出しに対して異なるオブジェクトが異なる動作をすることを言う。


抽象メソッド


実装を持たず、メソッドの意味だけを定義したメソッド。また、抽象クラスとはインスタンスを生成できないクラスのこと。


インターフェース

クラスが実装すべき規約を定めるもの。クラス設計者とクラス利用者の間の仲介役を担うのがインターフェース。

★インターフェースの定義

interface インターフェース名
{
メソッド・プロパティの宣言
}

★インターフェースの実装

class クラス名 : インターフェース名
{
クラスの定義
}



総称的プログラミングとも呼ばれ、さまざまな型に対応するために、型をパラメータとして与えて、
その型に対応したクラスや関数を生成するもの機能です。


クラスの場合

class クラス名<型引数>
where 型引数中の型が満たすべき条件
{
クラス定義
}



メソッドの場合

アクセスレベル 戻り値の型 メソッド名<型引数>(引数リスト)
where 型引数中の型が満たすべき条件
{
メソッド定義
}


デリゲート


メソッドを参照するための型です。

delegate 戻り値の型 デリゲート型名(引数リスト);


匿名関数


その場限りのメソッドを書くことが出来る機能がある。


★covariance

基底クラスを戻り値とするデリゲートに対して、派生クラスを戻り値とするメソッドを代入できること。

★contravariance

派生クラスを引数とするデリゲートに対して、基底クラスを引数とするデリゲートを
代入できること。


delegate(int n)
{
  return n > 0;
}



ラムダ式で表すと

(int n) => { return n > 0; };



引数リスト => 式


foreach構文は、コレクションクラスの利用者側から見ると非常に便利な機能ですが、実装側から見た場合、IEnumerableやIEnumeratorインターフェースを実装する必要があり、結構面倒な作業が必要でした。その実装側の労力を経験するために、追加された。



例:

using System.Collections.Generic;

class TestEnumerable
{
  // ↓これがイテレーター ブロック。IEnubrable を実装するクラスを自動生成してくれる。
  static public IEnumerable<int> FromTo(int from, int to)
  {
    while(from <= to)
      yield return from++;
  }

  static void Main(string[] args)
  {
    // ↓こんな感じで使う。
    foreach(int i in FromTo(10, 20))
    {
      Console.Write("{0}\n", i);
    }
  }
}


dynamic

動的言語との連携の仕組みの1つが動的型付け変数です。コレを使うことで動的なメンバーアクセスが可能になります。

var sx = 1;     // sx の型は int 型
dynamic dx = 1; // dx の型は dynamic 型


static object GetX(object obj)
{
  return obj.X;
}





リレーショナルデータベースや XML に対する操作をプログラミング言語に統合するものです。LINQ を用いることで、様々なタイプのデータソースに対する検索や操作を、 共通の構文で行うことができます。目的は、 データベース問い合わせとオブジェクト指向プログラミング(OOP: Object-Oriented Programming)の統合。