String と string どちらを使用すべきでしょうか


C# には `String` と `string` の２種類があります。  
一方はエイリアスですので、動作上の違いは無いと思いますが、  
記法を統一したい場合は、どちらで統一したほうがよいでしょうか。




Microsoftの出している[C# のコーディング規則](https://docs.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/inside-a-program/coding-
conventions)には言及がありません。どちらでもよく好みの問題と言えます。個人的にはエイリアスを支持していますが、他の方に強制するつもりはありません。中立的な視点で３点だけ問題を挙げておきます。

* * *

[フレームワーク デザインのガイドライン](https://docs.microsoft.com/en-us/dotnet/standard/design-
guidelines/)（日本語訳は壊れていて意味が反転している個所が多々あり役に立ちません）の[Avoiding Language-Specific
Names](https://docs.microsoft.com/en-us/dotnet/standard/design-
guidelines/general-naming-conventions#avoiding-language-specific-names)には

> For example, a method converting to Int64 should be named `ToInt64`, not
> `ToLong` (because Int64 is a CLR name for the C#-specific alias `long`).

とありこれに従うと

[code]

    // 型名を使う場合
    public Int64 ToInt64(...) {}
    // エイリアスを使う場合
    public long ToInt64(...) {}
    
[/code]

となり、エイリアス表記では違和感があります。

* * *

[`enum`](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-
reference/keywords/enum)では基になる型を指定できますが、ここで指定できる型は

> 列挙型で許容される型は、`byte`、`sbyte`、`short`、`ushort`、`int`、`uint`、`long`、または `ulong`
> です。

とエイリアス表記が明示されています。実際、`Int64`などの型名を指定するとコンパイルエラーになります。（新しめのコンパイラーでは`Int64`などの型名も受け入れるようになっています。）

* * *

構文解釈上、次のような違いがあります。

[code]

    // 型キャストとして解釈されます。
    (byte)-1;
    // 引き算として解釈されます。
    (Byte)-1;
    
[/code]

`(Byte)-1`について、説明というほどではありませんが、`Byte -
1`という引き算として解釈され、`Byte`という名前の変数・プロパティ等が見つからない場合には[CS0075](https://docs.microsoft.com/ja-
jp/dotnet/csharp/misc/cs0075)

> 負の値をキャストするには、値をかっこで囲んでください。

が発生します。説明の通り、キャストを行うためには`(Byte)(-1)`と記述する必要があります。




Microsoftの出している[C# のコーディング規則](https://docs.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/inside-a-program/coding-
conventions)には言及がありません。どちらでもよく好みの問題と言えます。個人的にはエイリアスを支持していますが、他の方に強制するつもりはありません。中立的な視点で３点だけ問題を挙げておきます。

* * *

[フレームワーク デザインのガイドライン](https://docs.microsoft.com/en-us/dotnet/standard/design-
guidelines/)（日本語訳は壊れていて意味が反転している個所が多々あり役に立ちません）の[Avoiding Language-Specific
Names](https://docs.microsoft.com/en-us/dotnet/standard/design-
guidelines/general-naming-conventions#avoiding-language-specific-names)には

> For example, a method converting to Int64 should be named `ToInt64`, not
> `ToLong` (because Int64 is a CLR name for the C#-specific alias `long`).

とありこれに従うと

[code]

    // 型名を使う場合
    public Int64 ToInt64(...) {}
    // エイリアスを使う場合
    public long ToInt64(...) {}
    
[/code]

となり、エイリアス表記では違和感があります。

* * *

[`enum`](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-
reference/keywords/enum)では基になる型を指定できますが、ここで指定できる型は

> 列挙型で許容される型は、`byte`、`sbyte`、`short`、`ushort`、`int`、`uint`、`long`、または `ulong`
> です。

とエイリアス表記が明示されています。実際、`Int64`などの型名を指定するとコンパイルエラーになります。（新しめのコンパイラーでは`Int64`などの型名も受け入れるようになっています。）

* * *

構文解釈上、次のような違いがあります。

[code]

    // 型キャストとして解釈されます。
    (byte)-1;
    // 引き算として解釈されます。
    (Byte)-1;
    
[/code]

`(Byte)-1`について、説明というほどではありませんが、`Byte -
1`という引き算として解釈され、`Byte`という名前の変数・プロパティ等が見つからない場合には[CS0075](https://docs.microsoft.com/ja-
jp/dotnet/csharp/misc/cs0075)

> 負の値をキャストするには、値をかっこで囲んでください。

が発生します。説明の通り、キャストを行うためには`(Byte)(-1)`と記述する必要があります。

