C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■85129 / )  Re[3]: C#のカウント
□投稿者/ 魔界の仮面弁士 (1415回)-(2017/09/12(Tue) 11:53:29)
No85125 (大谷刑部 さん) に返信
> そもそもVBとC#でできることにそんなに差はないかと。

とはいえ、言語仕様の微妙な差異は少なからずあるわけで。


今回の質問の意図は、VB のコードを真似て
 // C#
 label1.Text = label1.Text + 1;
と書いて見た場合に、数値加算ではなく、文字列連結になってしまい、結果として
 ' Visual Basic
 Label1.Text = Label1.Text & 1
に相当する処理になってしまったことが発端と推察します。


というのも、文字列型の値と整数型の値を + 演算した場合、
C# では string 型の連結処理として扱われますが、
VB では Double 型の加算処理として扱われる仕様だからです。
(この仕様は Option Strict の On/Off とは無関係です)


ついにで書いておくと、"123" * 2 という演算を行った場合、
C# はコンパイルエラーとなりますが、
Visual Basic は Double 型の 246 となり、
PowerShell は String 型の "123123" になります。

また、除算演算子の仕様も VB と C# とで異なっていますね。


>>  Label1.Text = CStr(CDbl(Label1.Text) + 1.0)
>> に相当するコードとして処理されることになります。
> むしろこのやり方の方がVB6チックな感じが。
VB6 だと、Label1.Text ではなく Label1.Caption になりそうですが、それはさておき。

個人的にはカウンター変数を用意するべきと思っていますが、
元の VB コードを真似て、あえてラベル単体でカウントさせるなら、
 label1.Text = 1 + int.Parse(label1.Text) + "";
などと書くこともできそうです。


> 非明示変換が発生するのでやるとしても整数のみの方がよいでしょう。
> 小数で型変換を指定しない場合は2進型であるdoubleで内部処理されるので
> 端数ずれの元です。
カウント値が 整数型 であるべきという点についてはそのとおりですね。

ただ端数といっても、double 型の精度は、2進数で52+1桁分あるので、
小数値を使わずに『整数値』に限定して扱う分には、
double 型でも誤差が生じることはありません。(10進数で15桁以下であれば)
返信 編集キー/


管理者用

- Child Tree -