[解決済み] VB.NETのコードをC#に移行すると、なぜforループの動作が異なるのですか?
2023-04-29 09:06:11
質問
Visual Basic から C# にプロジェクトを移行している最中ですが、その際に
for
ループの宣言方法を変更する必要がありました。
VB.NETでは
for
ループは以下のように宣言されています。
Dim stringValue As String = "42"
For i As Integer = 1 To 10 - stringValue.Length
stringValue = stringValue & " " & CStr(i)
Console.WriteLine(stringValue)
Next
どの出力か。
42 1
42 1 2
42 1 2 3
42 1 2 3 4
42 1 2 3 4 5
42 1 2 3 4 5 6
42 1 2 3 4 5 6 7
42 1 2 3 4 5 6 7 8
C#では
for
ループは以下のように宣言されています。
string stringValue = "42";
for (int i = 1; i <= 10 - stringValue.Length; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
そして、その出力。
42 1
42 1 2
42 1 2 3
これは明らかに正しくないので、コードを少し変更して、文字列の長さを保持する整数変数を入れなければなりませんでした。
以下のコードをご覧ください。
string stringValue = "42";
int stringValueLength = stringValue.Length;
for (int i = 1; i <= 10 - stringValueLength; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
そして、その出力。
42 1
42 1 2
42 1 2 3
42 1 2 3 4
42 1 2 3 4 5
42 1 2 3 4 5 6
42 1 2 3 4 5 6 7
42 1 2 3 4 5 6 7 8
さて、私の疑問は、Visual BasicがC#とどのように違うのかという点で、Visual Basicが
stringValue.Length
条件を
for
ループが発生するたびに文字列の長さが変化するにもかかわらず、stringValue.Length
の中で
for
のループ条件では、ループが発生するたびに文字列の初期値が変更されます。これはなぜでしょうか?
どのように解決するのですか?
C#では、ループ境界条件は各反復で評価されます。VB.NETでは、ループに入るときのみ評価されます。
ということは、問題のC#版では、ループ境界条件の長さは
stringValue
の長さがループ内で変更されているため、最終的なループ変数の値が変更されることになります。
VB.NETでは、最後の条件は包括的なので
<=
の代わりに
<
をC#に置き換えます。
C#の終了条件評価には、「変動はしないが計算にコストがかかる」場合でも、ループの前に一度だけ計算するべきだという副次的な意味合いがある。
関連
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] 2つのリストを結合する
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み] なぜpythonはforやwhileループの後に'else'を使うのですか?
-
[解決済み] なぜ無限ループになるのですか?
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?
-
[解決済み】.NETのforeachループでコレクションがNULLの場合、NullRefExceptionが投げられるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。