51245


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


CC BY-SA 4.0
2018-12-15T12:16:35.680
51232
2018-12-17T17:14:50.230
3925
question
c#
String と string どちらを使用すべきでしょうか


Stringのほうががいいと思いますよ！


CC BY-SA 4.0
2018-12-15T22:04:54.403
51238
2018-12-15T22:04:54.403
31464
51232
answer


好みであるとは思います。

ただ、Stringを選ぶのであれば、intもInt32、doubleもDouble、floatもSingleにする（キーワードを使わない）など、一貫性があった方が良いのでは？と感じます。

判断例  
\- C#やVB.NETなど、複数の言語が混じるような開発案件であれば、.NETの型名に合わせた方が混乱が少ない。  
\- 流用するソースコードが多い場合は、その流用元のルールに合わせた方が混乱が少ない。  
\-
StyleCopを使う案件では[SA1121](http://stylecop.soyuz5.com/SA1121.html)があるのでstringを使う。


CC BY-SA 4.0
2018-12-15T22:41:55.793
51240
2018-12-15T22:41:55.793
4684
51232
answer


[英語版のスタックオーバーフロー](https://stackoverflow.com/questions/7074/what-is-the-
difference-between-string-and-string-
in-c)に同じ質問がありますが、おっしゃる通り`string`は`String`のaliasです。  
マイクロソフトの例文などで多く使われているパターンをガイドラインとすると、以下の例のように、普通の変数として使う場合は`string`、文字列のメソッドを使用する時は`String`を使っています。

[code]

    //普通の変数
    string place = "world";
    
    //メソッドを使う
    string greet = String.Format("Hello {0}!", place);
    
[/code]

また、`String`を使った変数にする場合は`System`をインポートしなければいけませんが、`string`の場合はそのまま使えます。以下に例をあげます。

[code]

    //Stringの場合
    Using System;
    String place = "Japan";
    //または
    System.String place = "Japan";
    
    //stringの場合
    string place = "Japan";
    
[/code]


CC BY-SA 4.0
2018-12-16T02:50:06.530
51241
2018-12-17T17:14:50.230
2018-12-17T17:14:50.230
31397
31397
51232
answer


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)`と記述する必要があります。


CC BY-SA 4.0
2018-12-16T04:14:46.170
51245
2018-12-17T08:07:15.307
2018-12-17T08:07:15.307
4236
4236
51232
answer