7

私はC#を学び始めていますが、通常の文字列リテラル(つまり、" ")にリテラルの改行文字を含めることができない理由がわかりません。(私はエスケープシーケンスについて話していません\n)。複数行の文字列には逐語的な文字列リテラル(つまり)を使用する必要があることは知っています@" "が、なぜですか?

通常の文字列は 逐語的な文字列はエラーを生成しません

通常の文字列では使用できないと明示的に述べられているのを見たことがありません。それ以上に、これに逐語的な文字列を使用できると言及されている場合を除いて、私が読んだすべてのことは、リテラルの改行文字が通常の文字列リテラルで許可されることを示唆しているようです。

Visual C#2010およびコードの開始:複数行文字列リテラルの生成(Visual C#)は、詳細な説明なしで逐語的な複数行文字列の例を示しています。

C#3.0を学ぶと、次のようになります。

C#言語では、スペース、タブ、および改行は空白と見なされます。C#ステートメントでは、余分な空白は通常無視されます。...この規則の例外は、文字列内の空白がリテラルとして扱われることです。無視されません。

それで、それは文字通りですか?それも私が期待することですが、そうではありません。
このヒントボックスも含まれています:

ヒント
VisualBasicプログラマーは注意してください:C#では、行末は特別な意味を持ちません。ステートメントは、改行文字ではなくセミコロンで終了します。必要がないため、行継続文字はありません。

(これは文字列の外側について話していることを理解していますが、文字列の外側にない場合、行末が文字列の内側で特別な構文解析の重要性を持つのはなぜですか?)

ついに文字列(C#リファレンス)自体への道を見つけましたが、それでも洞察は得られませんでした。

文字列リテラルには、任意の文字リテラルを含めることができます。エスケープシーケンスが含まれています。\\次の例では、円記号、\u0066文字f、および\n改行にエスケープシーケンスを使用しています。

エスケープシーケンスを使用できると書かれていますが、使用する必要があるとは書かれていませ。リテラルの改行文字は「任意の文字リテラル」に含まれていませんか?エスケープシーケンスの代わりにリテラルタブ文字を含む文字列がある場合\t、エラーは発生しません。しかし、文字通りの改行があると、エラーが発生します。ファイルの行末を「効果なし」から「効果なし」に変更し\r\nまし\n\r


明らかに、例とVisual Studioエラーから、リテラルの改行文字が含まれている場合は逐語的な文字列が必要であると推測できますが、私が読んだすべてのことは、そうではないことを示唆しています。なぜ違いがあるのですか?

4

4 に答える 4

5

さて、撃ちます。これを提出していると、答えが見つかりました。

リテラルの改行文字は「任意の文字リテラル」に含まれていませんか?

どうやら、いいえ、そうではありません。

2.4.4.4文字リテラル

文字-リテラル:

' キャラクター '

キャラクター:

一文字

単一文字:

'(U + 0027)、\(U + 005C)、および改行文字以外のすべての文字

于 2012-08-30T21:56:25.580 に答える
1

C# (構文に影響を与えた C++、C、Java とともに) には、空白に関する非常に単純な規則があります。

あなたはそれでやりたいことをすることができます。

これにより、読みやすさのために必要に応じてフォーマットを使用できます。さて、Python ファンは利点が過大評価されていると言うかもしれませんが、それは私たちが利用している利点です。

文字列の改行はそれを台無しにする可能性があります。ソースの改行が、、、、、、、、または文字列"\u000D"に挿入"\u000A"すること"\u000A\u000D"を意味するかどうかわからない場合はなおさらです。これらはすべて改行のセマンティクスを持ち、最初の 4 つは異なるシステムの「唯一の正気」でした。改行のやり方、他の誰もが間違っている」."\u0085""\u000B""\u000C""\u2028""\u2029"

それを許可することのマイナス面は過大評価されているとまだ主張することができます. C# は可能です - 結局のところ、人々が C++ などから期待するようなものではない文字列の形式それを可能にします。

于 2012-08-30T22:15:40.223 に答える
1

なぜC/C++ 文字列リテラル宣言を単一行にする必要があるのですか?

一言で言えば、C言語がサポートしていないからです。

文字列リテラルを閉じないままにするタイプミスは、ファイルの残りの部分を 1 つのトークンとして丸呑みすることになり、プログラマーには、指定された場所が「xxx 行、yyy 列にセミコロンが必要です」という行に沿ってコンパイラ エラー メッセージが表示されます。ソースファイルの最後。

ほとんどの場合、複数行のリテラルは使用しません。UX の観点から明示的にする方がよいでしょう。

さらに、C 言語が (8K PDP-11?) で開発された制約のある環境では、ある種のオーバーフローによってコンパイラがクラッシュする可能性があると思われます。

ただし、C 言語はリテラル スプライシングをサポートしており、これは役に立ちます。

char *txt = "this is line 1\n"
            "this is line 2\n"
            "this is line 3\n"
            ;

また、ライン スプライシングもサポートしています。

char *txt = "this is my\n\
 multi-line string literal\n\
 isn't it nice?\n" ;

C# にあればいいのにと思う機能。

于 2012-08-30T22:08:40.977 に答える