C#[1]

2018/07/29

C#メモ

リテラル

C#の整数リテラルはint uint long ulongの順に当てはめられる。

## ショートサーキット評価

pが```true```ならばqは評価せずとも、```true```
そこで登場するのが短絡評価(サーキット評価)。  
サーキット評価は ```p||q```と記述し、pで式の評価が決まるならば、qの評価を行わない。

## 暗黙的型変換

```C#

//コンパイル可能
long longValue = 123131314;
double doubleValue = longValue;

//コンパイル失敗
long longValue = 123131314.1231;
double doubleValue = longValue;

//コンパイル失敗
decimal dValue = 12313;
float  f = dValue;
double d = dValue;

### decimal


decimal dValue = 0.01;
int iValue = 100
double doubleValue = 200.2;
float fValue 300.3;

// iValueはdecimalとして評価される。
var sum = dValue + iValue;
// エラー
var sum = dValue + doubleValue;
// エラー
var sum = dValue + fValue;

double

decimalがオペランドに含まれていない場合、もう一方のオペランドはdoubleに変換される。

float

decimal, floatがオペランドに含まれていない場合、もう一方のオペランドはfloatに変換される。

ulong

上記の場合以外、もう一方のオペランドはulongに変換される。 ただし、符号付型(sbyte, short, int long)の場合はエラーが発生する。

long

上記以外の場合、もう一方のオペランドはlongに変換される。

uint

上記以外の場合、一方のオペランドがsbyte, short, intの場合両オペランドがlong型に変換される。

uint

上記以外の場合、もう一方のオペランドもuintに変換される。

int

上記以外の場合、もう一方のオペランドはintに変換される。

注意点


byte b = 10;
int i =  b + b;
// intに変換されるためキャストが必要
byte b2 = (byte)(b+ b);
char c = (char)(b+ b);

単項演算子でも型変換は発生する。


byte b = 10;
int i = -b;

uint ui = 10;
//uintはlongに変換される。
long l = -10;

Switch

C#のSwitchは言語仕様で、あるcaseで処理が行われたら必ずbreakしなければならないと決められている。defaultでもこれは必須となっている。

C#のガベージコレクション

そのインスタンスがどこからも参照されなくなったらガベージコレクトされる。

デストラクタ


~ クラス名() {

}

ガベージコレクトされる際に呼ばれる。Javaと同様必ず呼び出される保証はないので、基本使用しない。

多次元配列


int[,] table = new int[10, 20];
int[,,] tripleTable = new int[10, 20, 30];

ジャグ配列


int[3][] jagged = new int[3][];
jagged[0] = new int[2];
jagged[1] = new int[3];
jagged[2] = new int[4];

jagged
[][]
[][][]
[][][][]