2016-01-06 16 views
24

私はC#を初めとしており、値の仕組みを理解したいと考えています。通常の整数値を見ると、3つの重要な部分があります:型、名前、値。数値の後ろにC#の接尾辞があります

int testInt = 3; 
| |  | 
Type Name Value 

しかし、私は理由サフィックスFのそれは私に少し混乱float値を参照してください。

float testFloat = 3.0F; 
    |  |  | | 
Type Name Value Type 

は、今では二つのタイプがあり、そしてFサフィックスなし値は、二重になります。しかし、なぜこの出来事は、最初の単語が十分でなければなりませんように私はそれではないはず、

double testDouble = 3.0D; 

doubleで二重の変数を宣言することができるときでしょうか?同じサフィックスMと小数値のために行く:

decimal testDecimal = 3.0M; 

そして、それは、他のサフィックスになると本当に私を混乱開始します。

ulong bigOne = 2985825802805280508UL; 

私が前にテストでulongを使用していることを知っていますuは「符号なし」であり、値を通常の2倍にすることができます。その後、あなたは再びサフィックスとしてUを取得し、Lはリテラルのためにgoogleと言った。私が理解しているように、「リテラル」は数値を含む値型です。しかし、私が理解できないことは、なぜこのulongは接尾辞なしでも機能するのかということです。

ulong bigOne = 2985825802805280508; 

は、それから私は、接尾辞

byte testLong = 12312UL; 

値はバイト(254)には高すぎるので、これは動作しませんでしたことの重要性を理解することは別の何かをしようとしたサフィックスは、それを変換しません。長い変数。

なぜ宣言に最初の単語(型)が足りないのですか?最初の単語はそのタイプを伝えるのに十分なはずです。常に値に接尾辞を付けるのがベストプラクティスですか?

+3

あなたが正しくても、割り当てがある場合は1つの型宣言で十分です。そのため、C#にvarキーワードが追加されました。https://msdn.microsoft.com/en-us/library/bb383973.aspx – Max

+3

「U」は未割り当てで、未割り当てではありません。 –

+1

また、4.0/3のような計算はどうですか?単精度または倍精度を使用する必要がありますか?それは本当に結果に影響します。 2000000000 * 3を考えていますか?それはオーバーフローですか、それとも長いですか?必ずしも直接値を指定するとは限りません。 – dryman

答えて

24

あなたはここでは2つの異なるものを混乱されています

float testFloat = 3.0F; 

floatは、変数testFloatが浮動小数点値であるウィルコンパイラに指示します。Fは、のリテラルが3.0であることをコンパイラに通知します。floatです。コンパイラは、変換または暗黙の変換のいずれかで変数にリテラルを割り当てることができるかどうかを決定する前に、両方の部分を知る必要があります。

float testFloat = 3; 

をそして、それは大丈夫です:

たとえば、あなたがこれを行うことができます。コンパイラは3をリテラル整数として認識しますが、精度を失うことなくfloatに割り当てることができます(これは暗黙の変換です)。しかし、あなたがこれを行う場合:

float testFloat = 3.0; 

3.0があるリテラルダブル(つまりは接尾辞なしのデフォルトだから)とフロートが低い精度を持っているので、それは暗黙的に(すなわち自動的に)doubleからfloatへ変換することはできません。つまり、情報になる可能性があります。だから、それは文字通りのフロートのコンパイラを教えて、次のいずれか

float testFloat = (float)3.0; 
+4

正確に。 'var result = 4/3;'を実行すると、コンパイラはそれが整数か浮動小数点演算かを決める必要があり、それは代入演算子の右側にあるものだけに依存します。デフォルトでは、整数値は 'int'とみなされ、10進値は' double'とみなされます。 'result'は1の' int'になります。代わりに '4/3.0'を実行すると' result'は1.3333333の値を持つ 'double'になります。 – Andrew

+0

今、私はより良いおかげで理解します。私は決してそれで計算された宣言をしなかった。数の間のドットは、コンパイラを理解するのに十分でなければならないと考えました。 – user3772108

+0

しかし、計算例でも。最初の浮動小数点は浮動小数点が必要なことを伝えるのに十分なはずです。接尾辞付きの長いバイトは機能しませんので、 – user3772108

2

名前の前にタイプを指定せずに変数を宣言するための他の方法が存在します。この場合

var myNumber = 10; 

を、変数の型は、リテラル値によって定義されます。

コンパイラは、型(double | float | int | ...)を "var"の代わりに使用すると、リテラル値を変数型(可能な場合)に変換します。

変数を宣言するのに "var"を使用し、接尾辞が使用されていないときにリテラル値の型がデフォルトで関連付けられていない場合は、接尾辞が重要だと思います。

式で暗黙的な変換を行う場合など、使用接尾辞が使いすぎるもう1つの理由があります。

+3

これは、異なる数値リテラルを接尾辞で区別する必要がある状況ですが、* reason *ではなく、確かにそのような状況ではありません(結局のところ、 'var'は言語にいくつかのバージョンが追加されました。接尾辞の必要性は開始以来そこにありました)。 – Servy

+0

したがって、すべての変数をvarと正しい接尾辞で宣言できますか? – user3772108

+1

@ user3772108ほとんどの場合、Funcを定義するのと同じように、いくつかの例外があります。しかし、ほとんどの宣言は 'var'で解決できます。例:' var arrayOfInt = new [] {1,2,3} '。 'Func add =(a、b)=> a + b'のような例は使えません。この場合、変数の型を定義する必要があります。ここで 'var'についてもっと学ぶことができますhttps://msdn.microsoft.com/en-us/library/bb383973.aspx –

10

すべて:

float testFloat = 3.0f; 

それとも、あなたが明示的キャストを使用して、精度の損失で大丈夫です、それを伝えます式はある型に解決可能である必要があります。したがって、式42は常にである必要があります。これは、のように、1つのタイプがの場合に正確にです。 intに割り当てる場合はintdoubleに割り当てる場合はdoubleにすることはできません。式が使用されるコンテキストは決してで解決されるタイプを決定するために使用されません。

このため、数値リテラルには接尾辞を付けることができます。その式の式の型を定義する方法です。そこに暗黙の変換が数値型の多くの間でもあるので、あなたはdouble d = 42;を書く場合の式42が実際に整数ですが、に変換すること、それに実行されている暗黙の型変換演算子があることを

注意割り当て前にdouble

ここでは、式のタイプが使用方法やメソッドグループに依存するラムダなど、いくつかの例外があります。真空中ではこれらの式は型を持たない。

+0

あなたの答えとマット・バランドは私に多くの理解を助けました。それに感謝します。 – user3772108

+0

@LucasTrzesniewskiかなり良い。 – Servy

関連する問題