文字列

文字列リテラル (string literals)

string str = "ABC";
文字列 - C# プログラミング ガイド | Microsoft Learn
"ABC".GetType().FullName; // "System.String"

エスケープ シーケンス (escape sequences)

エスケープ シーケンス 文字名 Unicode エンコーディング
\' 単一引用符  
\" 二重引用符  
\\ 円記号  
     
\u (小文字のu) Unicode エスケープ シーケンス (UTF-16) \uHHHH
\U (大文字のU) Unicode エスケープ シーケンス (UTF-32) \U00HHHHHH
\x 可変長の\u \xH[H][H][H]
文字列のエスケープ シーケンス - 文字列 - C# プログラミング ガイド | Microsoft Learn
string str1 = "\u00E7"; // "ç"
string str2 = "\U0001F47D"; // "👽"

逐語的文字列 (verbatim strings)

エスケープが必要な文字を、それをせずに記述できるようにする機能です。これは先に@を付加することで行え、エスケープを省けるため可読性を向上できます。標準リテラル文字列と逐語的リテラル文字列 - 文字列 (C# プログラミング ガイド) | Microsoft Learn

string str1 = "C:\dir\"; // error CS1009: 認識できないエスケープ シーケンスです。

string str2 = "AB // error CS1010: 定数の 新しい行です。
C";               // error CS0103: 現在のコンテキストに 'C' という名前は存在しません。
記述の相違
  標準リテラル文字列 逐語的リテラル文字列
バックスラッシュ
"C:\\dir\\";
@"C:\dir\";
改行
"AB\r\nC";
@"AB
C";
二重引用符
"AB\"C\"D";
@"AB""C""D";

補間文字列 (interpolated strings) / 挿入文字列

文字列内に式を記述でき、その結果をその位置に挿入できます。これはC# 6.0以降で利用できます。$ (C# リファレンス) | Microsoft Learn

逐語的文字列と併用するときには、$@"…"と記述します。ただしC# 8.0以降ならば、@$"…"としても有効です。 特殊文字 - $ - 文字列補間 - 文字列の出力を書式設定します - C# | Microsoft Learn c# - Why can't I use @$ prefix before strings? - Stack Overflow

$"text {interpolated-expression [,field-width] [:format-string] } text ..."

field-widthで最小文字数を、format-string書式指定文字列を指定できます。

int a = 15;

string str1 = $"ABC {a}";   // "ABC 15"
string str2 = $"ABC {a,5}"; // "ABC    15"
string str3 = $"ABC {a:X}"; // "ABC F"

文字列中に"{"や"}"を記述するには、それらを重ねて"{{"や"}}"とします。エスケープ中かっこ ({}) - 複合書式指定 | Microsoft Learn

interpolated-expression (補間式) にコロンを用いるときには、式全体をかっこで囲みます。

string str3 = $"ABC {(a == 0 ? 1 : 2)}";

既定ではCultureInfo.CurrentCultureで定義されたカルチャが用いられるため、意図しない文字列へ変換される恐れがあります。これは.NET 6以降ならば、String.Create()で変更できます。Culture-specific formatting - $ - string interpolation - format string output - C# | Microsoft Learn

.NET 6より前ならば、FormattableStringで指定のカルチャやインバリアント カルチャに変更できます。インバリアント カルチャを使用して結果文字列を作成する方法 - C# における文字列補間 - C# | Microsoft Learn

double value = 1.5;
string s1 = $"{value}"; // "1.5"

FormattableString format = $"{value}";
string s2 = format.ToString(CultureInfo.CreateSpecificCulture("en")); // "1.5"
string s3 = format.ToString(CultureInfo.CreateSpecificCulture("fr")); // "1,5" (小数点はカンマ)


DateTime dateTime = new DateTime(2000, 1, 2);
string s4 = $"{dateTime}";                              // "2000/01/02 0:00:00"
string s5 = FormattableString.Invariant($"{dateTime}"); // "01/02/2000 00:00:00"

インターン プール (intern pool)

宣言された文字列リテラルはすべて、インターンプールと呼ばれる場所に格納されます。そして共通の文字列はそれを参照することで、文字列用のストレージが節約されます。Remarks - String.IsInterned(String) Method (System) | Microsoft Learn

型変換

数値への変換

public static int Parse (
    string s,
    System.Globalization.NumberStyles style,
    IFormatProvider provider
    );
Parse(String, NumberStyles, IFormatProvider) - Int32.Parse メソッド (System) | Microsoft Learn

styleproviderを省略すると、NumberStyles.IntegerとNumberFormatInfo.CurrentInfoが指定されます。Parse - int32.cs

int a = Int32.Parse("123");
int b = Int32.Parse("0x10"); // System.FormatException
int c = Int32.Parse("A");    // System.FormatException
Int32.Parse メソッド (String) (System) | MSDN

Parse()では変換の失敗時に例外が発生します。それが例外的な事象ではないならば、失敗を考慮してTryParse()で処理します。

nt a = 10;
if(Int32.TryParse("123", out a))
{
    Console.Write(a); // 123
}

int b = 10;
if(Int32.TryParse("A", out b))
{
}
else
{
    Console.Write(b); // 0 (変換に失敗した場合は、その型の既定値になる)
}
Int32.TryParse メソッド (String, Int32) (System) | MSDN

10進以外の変換

Int32.Parse()でスタイルを指定して解析するか、Convert.ToInt32()で基数を指定して変換します。

int num1 = Int32.Parse("10", System.Globalization.NumberStyles.HexNumber); // 16
int num2 = Convert.ToInt32("10", 16); // 16
public static int Parse(
    string s,
    NumberStyles style
)
Int32.Parse メソッド (String, NumberStyles) (System) | MSDN
public static int ToInt32(
    string value,
    int fromBase // 基数。2、8、10または16
)
Convert.ToInt32 メソッド (String, Int32) (System) | MSDN

16進数以外も考えるならば、基数を指定して変換できるConvert.ToInt32()の方が融通がききます。

文字配列への変換

public void CopyTo(
    int sourceIndex,
    char[] destination,
    int destinationIndex,
    int count
)
String.CopyTo メソッド (Int32, Char[], Int32, Int32) (System) | MSDN
string source = "ABC";
char[] destination = new char[source.Length];

source.CopyTo(0, destination, 0, destination.Length);

C#のchar (System.Char) はC++のwchar_tに相当するため、C++のcharに変換するにはMarshalクラスのメソッドを用います。

ポインタへの変換

文字列へsbyteのポインタからアクセスできるようにするには、次のようにします。unmanaged - C#: Converting String to Sbyte* - Stack Overflow

string source = "abc";

byte[] bytes = Encoding.ASCII.GetBytes(source);
unsafe
{
    fixed (byte* pByte = bytes)
    {
        // ポインタを取得する
        sbyte* pSbyte = (sbyte*)pByte;

        // stringへ戻して確認する
        string str = new string(pSbyte); // "abc"
    }
}

ただしこの方法では、ASCII文字以外は適切に処理できません。

任意の型への変換

TypeConverter.ConvertFromString()を用いれば、変換する型を動的に決定できます。.net - C#: Dynamic parse from System.Type - Stack Overflow

static object Parse(Type type, string text)
{
    TypeConverter typeConverter = TypeDescriptor.GetConverter(type);
    return typeConverter.ConvertFromString(text);
}

文字コードの変換

HTMLエンコード

public static string HtmlEncode(
    string s
)
HttpUtility.HtmlEncode メソッド (String) (System.Web) | MSDN
string s1 = HttpUtility.HtmlEncode("ABC ' \" < > & あ"); // "ABC &#39; &quot; &lt; &gt; &amp; あ"

URLエンコード

public static string UrlEncode(
    string str
)
HttpUtility.UrlEncode メソッド (String) (System.Web) | MSDN
string s2 = HttpUtility.UrlEncode("ABC ; , / あ"); // "ABC+%3b+%2c+%2f+%e3%81%82"

参考

参考書

Microsoft Learnから検索