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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.85118 の関連記事表示

<< 0 >>
■85118  C#のカウント
□投稿者/ しろ -(2017/09/12(Tue) 08:12:33)

    分類:[.NET 全般] 

    VBでは、↓のようにすれば釦を押すごとにカウント
    しますがC#の場合はどしたのか忘れてしまいました
    Label1.Text = Label1.Text + 1
親記事 /過去ログ145より / 関連記事表示
削除チェック/

■85120  Re[1]: C#のカウント
□投稿者/ 魔界の仮面弁士 -(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)
    に相当するコードとして処理されることになります。
記事No.85118 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85125  Re[2]: C#のカウント
□投稿者/ 大谷刑部 -(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で内部処理されるので
    端数ずれの元です。
記事No.85118 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85129  Re[3]: C#のカウント
□投稿者/ 魔界の仮面弁士 -(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桁以下であれば)
記事No.85118 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85132  Re[4]: C#のカウント
□投稿者/ しろ -(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#は自己流でべきょうしているので
    かなかなわかりせんでした>


記事No.85118 のレス / END /過去ログ145より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -