string str = "ABC";文字列 - C# プログラミング ガイド | Microsoft Learn
"ABC".GetType().FullName; // "System.String"
エスケープ シーケンス | 文字名 | Unicode エンコーディング |
---|---|---|
\' | 単一引用符 | |
\" | 二重引用符 | |
\\ | 円記号 | |
\u (小文字のu) | Unicode エスケープ シーケンス (UTF-16) | \uHHHH |
\U (大文字のU) | Unicode エスケープ シーケンス (UTF-32) | \U00HHHHHH |
\x | 可変長の\u | \xH[H][H][H] |
string str1 = "\u00E7"; // "ç" string str2 = "\U0001F47D"; // "👽"
エスケープが必要な文字を、それをせずに記述できるようにする機能です。これは先に@を付加することで行え、エスケープを省けるため可読性を向上できます。標準リテラル文字列と逐語的リテラル文字列 - 文字列 (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"; |
文字列内に式を記述でき、その結果をその位置に挿入できます。これは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"
宣言された文字列リテラルはすべて、インターンプールと呼ばれる場所に格納されます。そして共通の文字列はそれを参照することで、文字列用のストレージが節約されます。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
styleやproviderを省略すると、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.FormatExceptionInt32.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
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); }
public static string HtmlEncode( string s )HttpUtility.HtmlEncode メソッド (String) (System.Web) | MSDN
string s1 = HttpUtility.HtmlEncode("ABC ' \" < > & あ"); // "ABC ' " < > & あ"
public static string UrlEncode( string str )HttpUtility.UrlEncode メソッド (String) (System.Web) | MSDN
string s2 = HttpUtility.UrlEncode("ABC ; , / あ"); // "ABC+%3b+%2c+%2f+%e3%81%82"