C#の「\n」とは?改行されない原因と正しい使い方を初心者向けに解説

はじめに

C#で文字列を扱っていると、よく登場するのが「\n」です。

"\n"は、文字列の中で改行を表すために使われます。たとえば、コンソールに複数行の文章を表示したいときや、ファイルに改行付きのテキストを書き出したいときに利用します。

しかし初心者のうちは、

\nを書いたのに改行されない」
\\n\nの違いがわからない」
Environment.NewLineとは何が違うの?」
「HTMLでは\nが効かないのはなぜ?」

といった疑問が出やすいです。

この記事では、C#の「\n」の意味、基本的な使い方、改行されない原因、"\r\n"Environment.NewLineとの違いまで、初心者向けにわかりやすく解説します。

1. C#の「\n」とは?改行を表すエスケープシーケンス

1-1. 「\n」は文字列の中で改行を意味する記号

C#の"\n"は、文字列の中で改行を表す記号です。

たとえば、次のように書きます。

C#
Console.WriteLine("こんにちは\nC#の学習を始めましょう");

このコードを実行すると、出力は次のようになります。

こんにちは
C#の学習を始めましょう

"\n"が入っている位置で、文字列が次の行に移動しています。

つまり、C#における"\n"は「ここで改行してください」という意味を持つ特殊な書き方です。

1-2. エスケープシーケンスとは何か

"\n"のように、バックスラッシュ\から始まる特別な記号をエスケープシーケンスと呼びます。

エスケープシーケンスは、通常の文字では表しにくい文字を文字列の中で表現するために使います。

たとえば、改行、タブ、ダブルクォーテーション、バックスラッシュなどです。

C#
Console.WriteLine("名前:\t田中");

この例では、\tがタブを表します。

名前:    田中

C#では、文字列の中でバックスラッシュを使うことで、特別な意味を持つ文字を表現できます。

1-3. 「n」だけでは改行にならない理由

改行を表すのは"\n"であり、"n"だけでは改行になりません。

C#
Console.WriteLine("こんにちはnC#");

この場合、出力は次のようになります。

こんにちはnC#

nはただのアルファベットとして扱われます。

改行として認識されるには、必ずバックスラッシュ\と組み合わせて"\n"と書く必要があります。

C#
Console.WriteLine("こんにちは\nC#");

出力は次のようになります。

こんにちは
C#

つまり、C#で改行をしたい場合は、単なるnではなく、エスケープシーケンスとしての"\n"を使います。

1-4. C#でよく使うエスケープシーケンス一覧

C#では、"\n"以外にもさまざまなエスケープシーケンスがあります。

エスケープシーケンス意味
\n改行
\rキャリッジリターン
\r\nWindowsでよく使われる改行
\tタブ
\\バックスラッシュ
\"ダブルクォーテーション
\'シングルクォーテーション
\0null文字

たとえば、ダブルクォーテーションを文字列の中に含めたい場合は、次のように書きます。

C#
Console.WriteLine("彼は\"こんにちは\"と言いました");

出力は次のようになります。

彼は"こんにちは"と言いました

バックスラッシュ自体を表示したい場合は、\\を使います。

C#
Console.WriteLine("C:\\Users\\Sample");

出力は次のようになります。

C:\Users\Sample

このように、C#では\を使って特別な文字を表現します。

2. C#で「\n」を使って改行する基本的な書き方

2-1. Console.WriteLineで「\n」を使う例

C#で"\n"を確認する一番簡単な方法は、Console.WriteLineで表示することです。

C#
Console.WriteLine("1行目\n2行目\n3行目");

実行結果は次のようになります。

1行目
2行目
3行目

"\n"を書いた場所で改行されます。

なお、Console.WriteLine自体にも「最後に改行する」という働きがあります。

C#
Console.WriteLine("こんにちは");
Console.WriteLine("C#");

この場合も、出力は複数行になります。

こんにちは
C#

Console.WriteLineは出力後に改行しますが、"\n"は文字列の途中で改行したいときに使います。

2-2. 文字列リテラルの中で改行する例

文字列リテラルとは、"..."で囲んだ文字列のことです。

C#
string message = "おはよう\nこんにちは\nこんばんは";

Console.WriteLine(message);

実行結果は次のようになります。

おはよう
こんにちは
こんばんは

このように、変数に代入する文字列の中でも"\n"は使えます。

2-3. 文字列連結で「\n」を使う例

文字列連結でも"\n"を使えます。

C#
string name = "佐藤";
string message = "名前: " + name + "\n" + "ようこそC#へ";

Console.WriteLine(message);

実行結果は次のようになります。

名前: 佐藤
ようこそC#へ

+で文字列をつなげるときに、間に"\n"を入れることで改行できます。

ただし、文字列連結が多くなると読みにくくなる場合があります。そのようなときは、文字列補間やStringBuilderを使うと見やすくなります。

2-4. 文字列補間で「\n」を使う例

文字列補間とは、文字列の中に変数の値を埋め込む書き方です。

文字列の前に$を付けます。

C#
string name = "田中";
int age = 25;

string message = $"名前: {name}\n年齢: {age}歳";

Console.WriteLine(message);

実行結果は次のようになります。

名前: 田中
年齢: 25歳

文字列補間の中でも、通常の文字列と同じように"\n"を使えます。

複数の値を見やすく表示したいときに便利です。

3. C#で「\n」が改行されない主な原因

3-1. 「\n」のようにバックスラッシュを2つ書いている

C#で"\n"が改行されない原因として多いのが、"\\n"と書いているケースです。

C#
Console.WriteLine("1行目\\n2行目");

この場合、出力は次のようになります。

1行目\n2行目

\\は「バックスラッシュそのもの」を表すエスケープシーケンスです。

そのため、"\\n"と書くと、C#は「改行」ではなく「\nという文字」として扱います。

改行したい場合は、次のように書きます。

C#
Console.WriteLine("1行目\n2行目");

出力は次のようになります。

1行目
2行目

"\n""\\n"は意味が違うので注意しましょう。

3-2. @付き文字列で「\n」を書いている

C#には、文字列の前に@を付ける書き方があります。

C#
string text = @"1行目\n2行目";

Console.WriteLine(text);

この場合、出力は次のようになります。

1行目\n2行目

@付き文字列では、\nが改行として解釈されません。

@付き文字列は、バックスラッシュをそのまま扱う文字列です。そのため、ファイルパスを書くときには便利ですが、\nによる改行は効きません。

C#
string path = @"C:\Users\Sample\Desktop";

このように、パスでは便利です。

一方、改行したい場合は、通常の文字列で"\n"を使うか、@付き文字列の中で実際に改行します。

C#
string text = @"1行目
2行目";

Console.WriteLine(text);

出力は次のようになります。

1行目
2行目

3-3. 表示先が改行コードに対応していない

"\n"が文字列の中に正しく入っていても、表示する場所によっては改行されないことがあります。

たとえば、次のような表示先です。

表示先注意点
コンソール基本的に改行される
テキストファイル基本的に改行される
Windows FormsのLabel設定や表示方法によって見え方が変わる
HTML\nだけでは画面上で改行されない
ログビューアツールによって表示が異なる
デバッグ表示\nが文字として見えることがある

C#の文字列としては正しく改行コードが入っていても、表示先がそれを改行として扱わなければ、期待通りに表示されません。

3-4. HTML上で表示している

WebページやHTML上では、C#の文字列に"\n"が入っていても、ブラウザ表示では改行されないことがあります。

たとえば、次のような文字列があるとします。

C#
string message = "1行目\n2行目";

HTMLにそのまま表示すると、画面上では次のように1行で表示されることがあります。

1行目 2行目

HTMLでは、通常の改行文字や連続する空白はそのまま画面表示に反映されません。

Webページ上で改行したい場合は、<br>タグを使うのが一般的です。

C#
string htmlMessage = message.Replace("\n", "<br>");

または、CSSで改行を反映させる方法もあります。

CSS
white-space: pre-line;

HTMLでは、C#の"\n"とブラウザ上の改行表示は別物として考える必要があります。

3-5. Windows環境で「\n」だけでは期待通りにならない場合がある

現在の多くの環境では"\n"だけでも改行として扱われることが多いですが、Windowsの一部のアプリケーションでは"\r\n"を期待する場合があります。

"\n"はLF、"\r\n"はCRLFと呼ばれる改行コードです。

Windowsでは歴史的に"\r\n"がよく使われてきました。

そのため、古いテキストエディタや一部のツールでは、"\n"だけだと正しく改行表示されないことがあります。

Windows向けのテキストファイルを出力する場合は、Environment.NewLineを使うと安全です。

C#
string text = "1行目" + Environment.NewLine + "2行目";

Environment.NewLineは、実行環境に合った改行文字を返してくれます。

3-6. デバッグ表示では「\n」がそのまま見えることがある

Visual Studioなどのデバッグ表示では、文字列の中の改行が"\n"として表示されることがあります。

たとえば、変数の中身が次のように見える場合があります。

"1行目\n2行目"

これは、実際に改行されていないという意味ではありません。

デバッガーが文字列の内容をわかりやすく表示するために、改行コードを"\n"として見せているだけです。

実際に出力して確認すると、改行されることがあります。

C#
string text = "1行目\n2行目";
Console.WriteLine(text);

実行結果は次のようになります。

1行目
2行目

デバッグ画面で"\n"が見えても、必ずしも間違いではありません。

4. 「\n」と「\r\n」とEnvironment.NewLineの違い

4-1. 「\n」はLFを表す

"\n"はLFを表します。

LFは「Line Feed」の略で、行を送るという意味です。

C#では、文字列の中で"\n"を書くと、LFという改行文字が入ります。

C#
string text = "1行目\n2行目";

多くのコンソールやエディタでは、この"\n"を改行として扱います。

LinuxやmacOSでは、改行コードとしてLFがよく使われます。

4-2. 「\r\n」はCRLFを表す

"\r\n"は、CRとLFを組み合わせた改行コードです。

CRは「Carriage Return」、LFは「Line Feed」です。

C#
string text = "1行目\r\n2行目";

Windowsでは、改行コードとして"\r\n"がよく使われます。

そのため、Windows向けのテキストファイルや一部のアプリケーションでは、"\r\n"を使うと期待通りに表示されやすくなります。

4-3. Windows・Mac・Linuxで改行コードが違う理由

改行コードは、OSの歴史的な違いによって異なります。

環境よく使われる改行コード
Windows\r\n
Linux\n
macOS\n
古いMac OS\r

現在のmacOSやLinuxでは、基本的に"\n"が使われます。

Windowsでは、昔から"\r\n"が標準的に使われてきました。

ただし、最近のエディタや開発環境は複数の改行コードに対応しているため、通常のプログラミングでは大きな問題にならないことも多いです。

4-4. Environment.NewLineを使うべき場面

Environment.NewLineは、実行環境に合った改行文字を返すプロパティです。

C#
string text = "1行目" + Environment.NewLine + "2行目";

Windowsで実行すると、通常は"\r\n"になります。

LinuxやmacOSで実行すると、通常は"\n"になります。

そのため、次のような場面ではEnvironment.NewLineを使うのがおすすめです。

場面おすすめ
OSに合わせた改行を使いたいEnvironment.NewLine
テキストファイルを出力するEnvironment.NewLine
ログを複数行で出力するEnvironment.NewLine
コンソールに簡単に表示する\nでも可
HTMLに表示する<br>やCSSを使う

とくに、ファイル出力やログ出力では、環境に合った改行コードを使えるEnvironment.NewLineが便利です。

4-5. 初心者はどれを使えばよいか

初心者の場合、まずは次のように考えるとわかりやすいです。

目的使い方
文字列の途中で簡単に改行したい\n
Windows向けの改行を明示したい\r\n
実行環境に合った改行にしたいEnvironment.NewLine
HTMLで改行したい<br>またはCSS
複数行文字列をそのまま書きたい@付き文字列や生文字列

学習段階では、まず"\n"を覚えれば問題ありません。

ただし、実際の開発では、ファイル出力やOSの違いを考える場面もあります。そのときはEnvironment.NewLineを使うとよいでしょう。

5. C#で改行する実践パターン

5-1. コンソールに複数行を表示する

コンソールに複数行を表示する場合は、"\n"またはConsole.WriteLineを使います。

C#
Console.WriteLine("商品名: りんご\n価格: 120円\n在庫: あり");

実行結果は次のようになります。

商品名: りんご
価格: 120円
在庫: あり

また、複数回Console.WriteLineを書く方法もあります。

C#
Console.WriteLine("商品名: りんご");
Console.WriteLine("価格: 120円");
Console.WriteLine("在庫: あり");

どちらでも改行できます。

短い表示なら"\n"、1行ずつ処理したいならConsole.WriteLineを複数回使うとわかりやすいです。

5-2. TextBoxやLabelで改行を表示する

Windows FormsやWPFなどで、TextBoxやLabelに改行を表示したい場合もあります。

Windows FormsのTextBoxで複数行を表示する場合は、Multilineを有効にする必要があります。

C#
textBox1.Multiline = true;
textBox1.Text = "1行目\r\n2行目";

または、次のようにEnvironment.NewLineを使えます。

C#
textBox1.Multiline = true;
textBox1.Text = "1行目" + Environment.NewLine + "2行目";

Labelの場合は、次のように書けます。

C#
label1.Text = "1行目" + Environment.NewLine + "2行目";

表示コントロールによって、改行の扱いが異なる場合があります。

「文字列には改行が入っているのに表示されない」というときは、コントロール側の設定も確認しましょう。

5-3. ファイル出力で改行する

C#でテキストファイルに改行付きの文字列を書き込む場合は、Environment.NewLineを使うと安全です。

C#
string text = "1行目" + Environment.NewLine + "2行目";

File.WriteAllText("sample.txt", text);

また、複数行を配列として書き出す場合は、File.WriteAllLinesも便利です。

C#
string[] lines = {
"1行目",
"2行目",
"3行目"
};

File.WriteAllLines("sample.txt", lines);

WriteAllLinesを使うと、各要素を1行としてファイルに書き込めます。

ログや設定ファイルなど、複数行のテキストを出力する場面で便利です。

5-4. CSVやログ出力で改行する

CSVやログ出力でも改行はよく使います。

ログを作る場合は、次のようにEnvironment.NewLineを使えます。

C#
string log = "";
log += "処理開始" + Environment.NewLine;
log += "データ読み込み完了" + Environment.NewLine;
log += "処理終了" + Environment.NewLine;

File.WriteAllText("log.txt", log);

ただし、文字列を何度も連結する場合は、StringBuilderを使うと効率的です。

C#
StringBuilder sb = new StringBuilder();

sb.AppendLine("処理開始");
sb.AppendLine("データ読み込み完了");
sb.AppendLine("処理終了");

File.WriteAllText("log.txt", sb.ToString());

AppendLineは、自動で改行を追加してくれます。

ログのように複数行を組み立てる場合は、StringBuilderAppendLineの組み合わせが便利です。

CSVの場合は、1レコードごとに改行します。

C#
StringBuilder csv = new StringBuilder();

csv.AppendLine("名前,年齢");
csv.AppendLine("田中,25");
csv.AppendLine("佐藤,30");

File.WriteAllText("data.csv", csv.ToString());

ただし、CSVの値の中に改行が含まれる場合は、ダブルクォーテーションで囲むなどのCSVルールに注意が必要です。

5-5. HTMLやWebページで改行する

C#で作った文字列をHTMLに表示する場合、"\n"だけではブラウザ上で改行されないことがあります。

C#
string message = "1行目\n2行目";

この文字列をHTMLにそのまま表示しても、画面上では1行に見える場合があります。

HTMLで改行を表示したい場合は、<br>に変換します。

C#
string htmlMessage = message.Replace("\n", "<br>");

ASP.NETなどで表示する場合は、HTMLエスケープとの関係にも注意が必要です。

ユーザー入力をそのままHTMLとして出力すると、セキュリティ上の問題が起こる可能性があります。

安全に表示したい場合は、まずHTMLエンコードを行い、その後で改行を<br>に変換するなど、適切な処理を行いましょう。

また、CSSで改行を反映させる方法もあります。

CSS
white-space: pre-line;

この指定を使うと、テキスト中の改行をブラウザ上でも表示しやすくなります。

6. @付き文字列と「\n」の注意点

6-1. @付き文字列では「\n」が改行として解釈されない

C#では、文字列の前に@を付けると、エスケープシーケンスが通常とは違う扱いになります。

C#
string text = @"1行目\n2行目";

Console.WriteLine(text);

出力は次のようになります。

1行目\n2行目

通常の文字列では"\n"が改行になります。

C#
string text = "1行目\n2行目";

しかし、@付き文字列では、\が特別扱いされず、ほとんどそのままの文字として扱われます。

そのため、@"\n"は改行ではなく、バックスラッシュとnの2文字になります。

6-2. @付き文字列で実際に改行する方法

@付き文字列で改行したい場合は、文字列の中で実際に改行します。

C#
string text = @"1行目
2行目
3行目";

Console.WriteLine(text);

実行結果は次のようになります。

1行目
2行目
3行目

@付き文字列では、ソースコード上の改行がそのまま文字列に含まれます。

そのため、長い文章やSQL文などを複数行で書きたいときに便利です。

C#
string sql = @"
SELECT *
FROM Users
WHERE Age >= 20
";

このように、複数行の文字列を見やすく書けます。

6-3. 通常の文字列と@付き文字列の使い分け

通常の文字列と@付き文字列は、目的によって使い分けると便利です。

書き方特徴向いている場面
"..."\nなどのエスケープシーケンスが使える短い文字列、改行やタブを明示したい場合
@"..."バックスラッシュをそのまま書けるファイルパス、複数行文字列、SQLなど

通常の文字列では、改行を"\n"で表せます。

C#
string text = "1行目\n2行目";

@付き文字列では、実際に改行します。

C#
string text = @"1行目
2行目";

どちらが正しいというより、状況に応じて使い分けるのが大切です。

6-4. パス文字列で@を使うときの注意点

Windowsのファイルパスでは、バックスラッシュ\を使います。

通常の文字列でパスを書く場合、バックスラッシュを\\と書く必要があります。

C#
string path = "C:\\Users\\Sample\\Desktop";

一方、@付き文字列を使うと、バックスラッシュをそのまま書けます。

C#
string path = @"C:\Users\Sample\Desktop";

このため、Windowsのパスを書くときは@付き文字列がよく使われます。

ただし、@付き文字列の中で"\n"を書いても改行にはなりません。

C#
string text = @"C:\newfolder\note.txt";

この場合の\nは改行ではなく、パスの一部として扱われます。

パス文字列では便利ですが、改行を入れたい文字列とは使い方が違うので注意しましょう。

7. C#で改行コードを変換・削除する方法

7-1. Replaceで「\n」を別の文字に置換する

C#では、Replaceを使って改行コードを別の文字に置換できます。

C#
string text = "りんご\nみかん\nバナナ";

string result = text.Replace("\n", ",");
Console.WriteLine(result);

実行結果は次のようになります。

りんご,みかん,バナナ

Replace("\n", ",")は、文字列の中にあるLF改行をカンマに置き換えています。

HTML用に<br>へ変換する場合は、次のように書けます。

C#
string html = text.Replace("\n", "<br>");

ただし、文字列に"\r\n"が含まれている場合は、"\n"だけを置換すると"\r"が残ることがあります。

そのため、Windows形式の改行も考慮する場合は注意が必要です。

7-2. 「\r\n」と「\n」を統一する

改行コードが混在している文字列を扱う場合は、先に統一すると処理しやすくなります。

たとえば、すべての改行を"\n"に統一する場合は、次のように書けます。

C#
string text = "1行目\r\n2行目\n3行目";

string normalized = text.Replace("\r\n", "\n");

さらに、単独の"\r"も考慮するなら、次のようにします。

C#
string normalized = text
.Replace("\r\n", "\n")
.Replace("\r", "\n");

これで、"\r\n""\r""\n"に統一できます。

逆に、Windows形式の"\r\n"に統一したい場合は、一度"\n"に統一してから変換すると安全です。

C#
string normalized = text
.Replace("\r\n", "\n")
.Replace("\r", "\n")
.Replace("\n", "\r\n");

改行コードを扱うときは、順番が重要です。

先に"\n""\r\n"へ変換してしまうと、もともと"\r\n"だった部分が崩れることがあります。

7-3. 改行を削除して1行にする

文字列から改行を削除して1行にしたい場合は、Replaceを使います。

C#
string text = "1行目\n2行目\n3行目";

string oneLine = text.Replace("\n", "");
Console.WriteLine(oneLine);

実行結果は次のようになります。

1行目2行目3行目

単語の間にスペースを入れたい場合は、空文字ではなくスペースに置換します。

C#
string oneLine = text.Replace("\n", " ");

"\r\n"も考慮する場合は、次のように書くとよいです。

C#
string oneLine = text
.Replace("\r\n", " ")
.Replace("\r", " ")
.Replace("\n", " ");

ユーザー入力や外部ファイルから読み込んだ文字列では、改行コードが統一されていないこともあります。

そのため、複数の改行パターンを考慮すると安全です。

7-4. Splitで改行ごとに文字列を分割する

改行ごとに文字列を分割したい場合は、Splitを使います。

C#
string text = "りんご\nみかん\nバナナ";

string[] lines = text.Split('\n');

foreach (string line in lines)
{
Console.WriteLine(line);
}

実行結果は次のようになります。

りんご
みかん
バナナ

ただし、"\r\n"の文字列を'\n'で分割すると、各行の末尾に'\r'が残ることがあります。

その場合は、先に改行コードを統一してから分割すると扱いやすいです。

C#
string normalized = text
.Replace("\r\n", "\n")
.Replace("\r", "\n");

string[] lines = normalized.Split('\n');

空行を除外したい場合は、次のように書けます。

C#
string[] lines = normalized.Split(
'\n',
StringSplitOptions.RemoveEmptyEntries
);

改行ごとに処理したい場合は、改行コードの種類を意識して分割することが大切です。

8. 「\n」がうまく動かないときの確認ポイント

8-1. 文字列に本当に「\n」が入っているか確認する

まず確認したいのは、文字列に本当に改行コードとしての"\n"が入っているかどうかです。

次の2つは意味が違います。

C#
string text1 = "1行目\n2行目";
string text2 = "1行目\\n2行目";

text1には改行コードが入っています。

text2には、バックスラッシュとnの文字が入っています。

確認するには、実際に出力してみるのが簡単です。

C#
Console.WriteLine(text1);
Console.WriteLine("-----");
Console.WriteLine(text2);

実行結果は次のようになります。

1行目
2行目
-----
1行目\n2行目

"\\n"になっていないかを確認しましょう。

8-2. 表示先が改行に対応しているか確認する

文字列に"\n"が入っていても、表示先が改行に対応していなければ、見た目では改行されません。

たとえば、HTMLでは"\n"だけでは画面上の改行にならないことがあります。

また、UI部品によっては、複数行表示の設定が必要な場合があります。

Windows FormsのTextBoxなら、Multilinetrueにします。

C#
textBox1.Multiline = true;
textBox1.Text = "1行目" + Environment.NewLine + "2行目";

表示先によって必要な設定が違うため、文字列だけでなく表示側の仕様も確認しましょう。

8-3. @文字列やエスケープの書き方を確認する

@付き文字列では、"\n"が改行として解釈されません。

C#
string text = @"1行目\n2行目";

この場合、\nはそのまま表示されます。

改行したい場合は、通常の文字列を使います。

C#
string text = "1行目\n2行目";

または、@付き文字列の中で実際に改行します。

C#
string text = @"1行目
2行目";

@が付いているかどうかは、初心者が見落としやすいポイントです。

8-4. 環境に合った改行コードを使っているか確認する

改行コードには、"\n""\r\n""\r"などがあります。

表示する環境や保存するファイルによっては、期待される改行コードが異なる場合があります。

C#で環境に合った改行を使いたい場合は、Environment.NewLineを使いましょう。

C#
string text = "1行目" + Environment.NewLine + "2行目";

ファイル出力やログ出力では、Environment.NewLineを使うと環境差を吸収しやすくなります。

一方、通信データや特定のフォーマットでは、仕様で改行コードが決まっている場合があります。

その場合は、環境ではなく仕様に合わせて"\n""\r\n"を選ぶ必要があります。

9. C#の「\n」に関するよくある質問

9-1. 「\n」と「WriteLine」は何が違う?

"\n"は、文字列の中に入れる改行文字です。

一方、Console.WriteLineは、文字列を表示したあとに改行を追加するメソッドです。

C#
Console.WriteLine("1行目\n2行目");

この場合、"\n"によって文字列の途中で改行され、さらにWriteLineによって最後にも改行が追加されます。

1行目
2行目

Console.Writeを使うと、最後の自動改行はありません。

C#
Console.Write("1行目\n2行目");

"\n"は文字列の途中で改行したいときに使い、WriteLineは出力の最後で改行したいときに使う、と考えるとわかりやすいです。

9-2. 「\n」を文字として表示したい場合は?

"\n"を改行ではなく、文字として表示したい場合は、バックスラッシュをエスケープします。

C#
Console.WriteLine("\\n");

出力は次のようになります。

\n

また、@付き文字列を使う方法もあります。

C#
Console.WriteLine(@"\n");

この場合も、出力は次のようになります。

\n

つまり、改行ではなく文字としての\nを表示したい場合は、"\\n"または@"\n"を使います。

9-3. 「\n」がそのまま表示されるのはなぜ?

"\n"がそのまま表示される主な原因は、次のようなものです。

原因
\\nと書いている"1行目\\n2行目"
@付き文字列を使っている@"1行目\n2行目"
JSONなどでエスケープされた文字列をそのまま表示している"1行目\\n2行目"
HTMLなど表示先が改行を反映しないブラウザ表示
デバッガー上でエスケープ表示されている変数表示

たとえば、次のコードでは改行されません。

C#
Console.WriteLine(@"1行目\n2行目");

出力は次のようになります。

1行目\n2行目

改行したい場合は、通常の文字列で書きます。

C#
Console.WriteLine("1行目\n2行目");

9-4. 改行は「\n」とEnvironment.NewLineのどちらが正しい?

どちらも正しいですが、使う場面が少し違います。

"\n"は、文字列の中で明示的にLF改行を入れたいときに使います。

C#
string text = "1行目\n2行目";

Environment.NewLineは、実行環境に合った改行を入れたいときに使います。

C#
string text = "1行目" + Environment.NewLine + "2行目";

初心者がコンソール表示で学習する場合は、まず"\n"で問題ありません。

実際のアプリ開発で、ファイル出力やログ出力を行う場合は、Environment.NewLineを使うと環境に合わせやすくなります。

ただし、CSV、HTTP、JSON、特定のAPIなど、仕様で改行コードが決まっている場合は、その仕様に従う必要があります。

9-5. C#で複数行の文字列を書く方法は?

C#で複数行の文字列を書く方法はいくつかあります。

まず、"\n"を使う方法です。

C#
string text = "1行目\n2行目\n3行目";

次に、Environment.NewLineを使う方法です。

C#
string text = "1行目"
+ Environment.NewLine
+ "2行目"
+ Environment.NewLine
+ "3行目";

@付き文字列を使って、ソースコード上でそのまま複数行にする方法もあります。

C#
string text = @"1行目
2行目
3行目";

また、C#の新しいバージョンでは、生文字列リテラルを使う方法もあります。

C#
string text = """
1行目
2行目
3行目
""";

複数行の文章を自然に書きたい場合は、@付き文字列や生文字列リテラルが便利です。

一方、短い文字列の途中で改行したいだけなら、"\n"が手軽です。

まとめ

C#の"\n"は、文字列の中で改行を表すエスケープシーケンスです。

C#
Console.WriteLine("1行目\n2行目");

このように書くと、"\n"の位置で改行されます。

ただし、"\n"が改行されない場合には、いくつかの原因があります。

たとえば、"\\n"と書いている場合、\nは改行ではなく文字として扱われます。

C#
Console.WriteLine("1行目\\n2行目");

また、@付き文字列では、"\n"は改行として解釈されません。

C#
Console.WriteLine(@"1行目\n2行目");

HTMLに表示する場合も、"\n"だけではブラウザ上の改行にならないことがあります。その場合は、<br>に変換したり、CSSのwhite-spaceを使ったりする必要があります。

改行コードには、"\n""\r\n"Environment.NewLineがあります。

初心者は、まず次のように覚えるとよいです。

目的使うもの
文字列の途中で簡単に改行したい\n
Windows形式の改行を明示したい\r\n
実行環境に合わせたいEnvironment.NewLine
HTMLで改行したい<br>やCSS
複数行文字列をそのまま書きたい@付き文字列や生文字列

C#で文字列を扱ううえで、"\n"は基本中の基本です。

改行されないときは、"\\n"になっていないか、@付き文字列になっていないか、表示先が改行に対応しているかを確認しましょう。