F# と C# の記法比較

MSDN F# リファレンスを使い C# と記法を比較する

文字列

文字列 Strings

元ネタ http://msdn.microsoft.com/ja-jp/library/dd323829.aspx

エスケープシーケンスの扱いは C# と同じ。

@ 記号の後に続くリテラルは、逐語的文字列です。 この場合、2 つの引用符文字が 1 つの引用符文字として解釈されることを除いて、エスケープ シーケンスはすべて無視されます。

また、文字列は三重の引用符で囲まれている場合があります。

F#

let data = 
    """
    ここで複数行のデータを書ける。
    XMLデータとかを文字列で書けるので良いらしい。
    """

@ 記号を使った書き方

F#

// Using a verbatim string
let xmlFragment1 = @"<book author=""Milton, John"" title=""Paradise Lost"">"

// Using a triple-quoted string
let xmlFragment2 = """<book author="Milton, John" title="Paradise Lost">"""

C# も @ 記号で文字列をエスケープできる。 C#

string xmlFragment1 = @"<book author=""Milton, John"" title=""Paradise Lost"">";

1文字だけ出力する。

F#

printfn "%c" str1.[1]

C# の場合は、string.Format を使う。

C#

Console.WriteLine("{0}", str1[1] );

部分文字列を表示する

F#

printfn "%s" (str1.[0..2])
printfn "%s" (str2.[3..5])

F# の意味としては、それぞれの要素を指定しているので範囲とは異なるのだが、C# の場合は文字列に対しては直に Substring を使う。

C#

Console.WriteLine("{0}", str1.Substring(0,3));
Console.WriteLine("{0}", str2.Substring(3,3));

リテラル文字列が ASCII 文字列であることを示すには、サフィックス B を追加します。

F#

// "abc" interpreted as a Unicode string.
let str1 : string = "abc"
// "abc" interpreted as an ASCII byte array. 
let bytearray : byte[] = "abc"B 

Unicode(Char)ではなくて、ASCII(byte)という違いがある。

C# の場合は、文字列は Char で扱うので byte 配列に変換する拡張メソッドを用意する。

C#

public void test()
{
    string str1 = "abc";
    byte[] bytearray = "abc".B();
}

public static class StringExtentions
{
    public static byte[] ToByteArray( this string str )
    {
        var src = str.ToArray<char>();
        var dest = new byte[str.Length];
        for ( int i=0; i<dest.Length; i++ ) {
            dest[i] = (byte)src[i];
        }
        return dest;
    }
    public static byte[] B(this string str) { return str.ToByteArray(); }
}

文字列演算

文字列を連結するには、+ 演算子または ^ 演算子を使用する 2 つの方法があります。

F#

let string1 = "Hello, " + "world"

これは C# も同じ。

C#

var string1 = "Hello, " + "world";

String クラス

String の Chars プロパティを使用すると、次のコードに示すように、インデックスを指定して文字列中の各文字にアクセスできます。

F#

let printChar (str : string) (index : int) =
    printfn "First character: %c" (str.Chars(index))

Chars プロパティはないが、そのまま Char 配列として扱える。

C#

void printChar(string str, int index)
{
    Console.WriteLine("First character: %c", str[index]);
}