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

わんくま同盟

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

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

ツリー一括表示

C#のカウント /しろ (17/09/12(Tue) 08:12) #85118
Re[1]: C#のカウント /魔界の仮面弁士 (17/09/12(Tue) 08:58) #85120
  └ Re[2]: C#のカウント /大谷刑部 (17/09/12(Tue) 10:55) #85125
    └ Re[3]: C#のカウント /魔界の仮面弁士 (17/09/12(Tue) 11:53) #85129
      └ Re[4]: C#のカウント /しろ (17/09/12(Tue) 12:32) #85132 解決済み


親記事 / ▼[ 85120 ]
■85118 / 親階層)  C#のカウント
□投稿者/ しろ (12回)-(2017/09/12(Tue) 08:12:33)

分類:[.NET 全般] 

VBでは、↓のようにすれば釦を押すごとにカウント
しますがC#の場合はどしたのか忘れてしまいました
Label1.Text = Label1.Text + 1
[ □ Tree ] 返信 編集キー/

▲[ 85118 ] / ▼[ 85125 ]
■85120 / 1階層)  Re[1]: C#のカウント
□投稿者/ 魔界の仮面弁士 (1414回)-(2017/09/12(Tue) 08:58:05)
No85118 (しろ さん) に返信
> 釦を押すごとにカウント

private int counter;
private void Form1_Load(object sender, EventArgs e)
{
  counter = 0;
  label1.Text = counter.ToString("N0");
}
private void button1_Click(object sender, EventArgs e)
{
  label1.Text = (++counter).ToString("N0");
}

Public Class Form1
  Private counter As Integer
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    counter = 0
    Label1.Text = counter.ToString("N0")
  End Sub
  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    counter += 1
    Label1.Text = counter.ToString("N0")
  End Sub
End Class



> Label1.Text = Label1.Text + 1

VB のそれは、Option Strict On ではエラーになるのご注意ください。

Option Strict Off の場合に限りコンパイルが通りますが、その場合は
 Label1.Text = CStr(CDbl(Label1.Text) + 1.0)
に相当するコードとして処理されることになります。
[ 親 85118 / □ Tree ] 返信 編集キー/

▲[ 85120 ] / ▼[ 85129 ]
■85125 / 2階層)  Re[2]: C#のカウント
□投稿者/ 大谷刑部 (41回)-(2017/09/12(Tue) 10:55:44)
No85120 (魔界の仮面弁士 さん) に返信
> ■No85118 (しろ さん) に返信
>>釦を押すごとにカウント
>
> private int counter;
> private void Form1_Load(object sender, EventArgs e)
> {
>   counter = 0;
>   label1.Text = counter.ToString("N0");
> }
> private void button1_Click(object sender, EventArgs e)
> {
>   label1.Text = (++counter).ToString("N0");
> }
>
> Public Class Form1
>   Private counter As Integer
>   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
>     counter = 0
>     Label1.Text = counter.ToString("N0")
>   End Sub
>   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
>     counter += 1
>     Label1.Text = counter.ToString("N0")
>   End Sub
> End Class

ちなみに+=はVBでも使えます。(.Netの初期から)
そもそもVBとC#でできることにそんなに差はないかと。
特に最近は構文がBasic系とC系の違いがある以外は、
ほとんど違いを感じません。


>>Label1.Text = Label1.Text + 1
>
> VB のそれは、Option Strict On ではエラーになるのご注意ください。
>
> Option Strict Off の場合に限りコンパイルが通りますが、その場合は
>  Label1.Text = CStr(CDbl(Label1.Text) + 1.0)
> に相当するコードとして処理されることになります。

むしろこのやり方の方がVB6チックな感じが。
魔界の仮面弁士 さんがご指摘の通り、
非明示変換が発生するのでやるとしても整数のみの方がよいでしょう。
小数で型変換を指定しない場合は2進型であるdoubleで内部処理されるので
端数ずれの元です。
[ 親 85118 / □ Tree ] 返信 編集キー/

▲[ 85125 ] / ▼[ 85132 ]
■85129 / 3階層)  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桁以下であれば)
[ 親 85118 / □ Tree ] 返信 編集キー/

▲[ 85129 ] / 返信無し
■85132 / 4階層)  Re[4]: C#のカウント
□投稿者/ しろ (14回)-(2017/09/12(Tue) 12:32:34)
No85129 (魔界の仮面弁士 さん) に返信
> ■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桁以下であれば)

どうもありがとうございます
VBはある程度プログラミングスクールで習ったのですがC#は自己流でべきょうしているので
かなかなわかりせんでした>



解決済み
[ 親 85118 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -