滅入るんるん

何か書きます

Kotlin使いのためのC#入門 Basic Types

> Top

Numbers

Kotlinの数値型はJavaに合わせて用意されています。明らかなJavaScriptとの差異があるのはそのためです。

数値型 Kotlin C#
符号有り1byte整数 Byte sbyte
符号無し1byte整数 ※UByte byte
符号有り2byte整数 Short short
符号無し2byte整数 ※UShort ushort
符号有り4byte整数 Int int
符号無し4byte整数 ※UInt uint
符号有り8byte整数 Long long
符号無し8byte整数 ※ULong ulong
4byte浮動小数点 Float float
8byte浮動小数点 Double double
16byte浮動小数点 decimal

※Kotlin 1.3で実験的に追加される型: KEEP

現時点ではKotlinよりもC#のほうが数値型は非常に多く用意されています。Kotlin 1.3で実験的に追加される符号無し整数は疑似的に再現されているようなので、ULongの場合はLongの整数領域を超える場合があるので、個人的にパフォーマンス上の懸念があります

また、16byte浮動小数点を表すdecimalという便利な型がC#には存在していますが、この型は単に数値の範囲を広くしたものではなく、より正確な計算をするための型です。そのため、むしろdoubleより扱える範囲は狭かったりします。

Literal Constants

リテラル Kotlin C#
2進数リテラル prefix 0b prefix 0b
16進数リテラル prefix 0x prefix 0x
符号有り8byte整数リテラル postfix L postfix L
符号無し8byte整数リテラル postfix UL
4byte浮動小数点リテラル postfix F postfix F
8byte浮動小数点リテラル postfix D
16byte浮動小数点リテラル postfix M

C#でのpostfixな数値リテラルは実際には少し複雑な仕様ですが、簡略化した表記をしています。

Underscores in numeric literals

Kotlin 1.1から追加されたアンダースコアによる数値リテラル区切りですが、C# 7.xで順次機能追加されました。

class SeparateNumber
{
    private readonly int n10000 = 1_0000;
    private readonly int hex = 0x_FF_FF;
}

Representation

Kotlinでのnullableな数値型はJavaには存在しないため、box化されます。そのため、box化された値は必ずしも同値扱いされるとは限りませんが、C#ではNullable構造体によって(値型に対する)null許容型が提供されるため、Kotlinのような心配は必要ありません。

Explicit Conversions

Kotlinでは数値型の変換をtoInt()などの関数によって明示的に行いますが、C#ではより大きな型に対する変換は暗示的に行うことができます。

Operations

Kotlinでは演算子に別名が付けられていたりしますが、C#には別名はつけられていません。そのため、Java/Cのように記号の演算子を使います。

Floating Point Numbers Comparison

Characters

Kotlinと同様にC#も文字リテラルはシングルクォート'で囲みます。 また、C#の文字リテラルはUTF16による16bit整数で表されます。

型の対応表は以下の通りです。

Kotlin C#
文字型 Char char

Booleans

KotlinとC#の真偽値型に大差はありません。

型の対応表は以下の通りです。

Kotlin C#
真偽値型 Boolean bool

Arrays

KotlinでのArrayはArray<T>とプリミティブ型に対するArray(IntArrayなど)が用意されていましたが、C#はJavaのような記法です。

class Array
{
    public readonly int[] Empty = new int[0];

    // 初期値を与える場合
    public readonly int[] Default = new int[] { 1, 2, 3, 4 };

    // JavaやKotlinで多次元配列と呼ばれていたものはジャグ配列と呼ばれる
    public readonly int[][] JaggedArray = new int[10][];

    // C#には多次元配列が存在する
    public readonly int[,] MultiDimensionalArray = new int[10, 10];
}

また、C#には多次元配列が存在します。いわゆる配列の配列との違いは、要素が長方形または正方形になるように並べられていることです。(ジャグ配列は棒グラフのように配置されるイメージ)

Strings

C#の文字列型はKotlinの文字列型と同じくUTF-16な不変オブジェクトです。

型の対応表は以下の通りです。

Kotlin C#
文字列型 String string

String Literals, String Templates

C#ではRawStringには文字列リテラルの先頭に@を追加します。 また、文字列テンプレートは文字列補間と呼ばれ、文字列リテラルの先頭に$を付け補間するものを{}で囲います。

class StringLiteral
{
    public const string Text = "text";

    public readonly string RawText = @"Hello,

World!!
";
    public readonly string Title = $"Text: {Text}";
}

文字列補間は非常に強力な機能ですが、詳しくはドキュメントを参照してください。

また、C#では現在RawStringと文字列補間を同時に利用することができませんが、C# 8.0以降でサポートされる予定です。