いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-007 (System.String)

System.Stringは、文字通り文字列を表します。


C#内では、stringとしてエイリアスが設定されています。
Javaの場合と同じく不変オブジェクトであり、文字列リテラル
をコード内に記述すると自動的にこのクラスのオブジェクトと
なります。


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.Text;

using Gsf.Research.ClassLibrary;

namespace Gsf.Research.ClassLibrary.System{

    /// <summary>
    /// System.Stringクラスのサンプルです。
    /// </summary>
    /// <remarks>
    /// C#内では、stringとしてエイリアスが設定されています。
    /// Javaの場合と同じく不変オブジェクトであり、文字列リテラル
    /// をコード内に記述すると自動的にこのクラスのオブジェクトと
    /// なります。
    /// </remarks>
    public class StringResearch00 : IExecutable{

        public void Execute(){

            string s = "Hello World";

            //
            // String.Empty
            //
            // 空文字を表す読み取り専用のプロパティです。
            //
            Console.WriteLine("s is Empty?={0}", s == string.Empty);

            //
            // IsNullOrEmptyメソッド
            //
            // 該当する文字列がnullまたは空文字かどうかをチェックします。
            //
            Console.WriteLine("s is Null Or Empty?={0}", string.IsNullOrEmpty(s));
            Console.WriteLine("s is Null Or Empty?={0}", string.IsNullOrEmpty(string.Empty));
            Console.WriteLine("s is Null Or Empty?={0}", string.IsNullOrEmpty(null));

            //
            // Lengthプロパティ
            //
            // 文字列の長さを返します。
            // 文字列は、内部ではcharのシーケンスでありUNICODEで保持されています。
            // 日本語をカウントする際に、そのままLengthプロパティを使うと"あ"という
            // 文字は、1文字としてカウントされます。バイト数でカウントする際は
            // 以下のように、System.Text.Encodingクラスの該当エンコーディングのGetByteCountメソッドを
            // 使用します。
            // この辺の事情も、Javaと同じです。
            //
            Console.WriteLine("length={0}", s.Length);
            Console.WriteLine("length={0}", "あ".Length);                                           //=> 1
            Console.WriteLine("length={0}", Encoding.GetEncoding("shift-jis").GetByteCount("あ"));  //=> 2

            //
            // Containsメソッド
            //
            // 指定した文字列が、存在するかどうかを返します。
            //
            Console.WriteLine("'llo' contains at s={0}", s.Contains("llo"));

            //
            // EndsWithメソッド
            //
            // 指定した文字列が該当文字列データの末尾が一致するかどうかを返します。
            //
            Console.WriteLine("'d' endswith={0}", s.EndsWith("d"));

            //
            // Formatメソッド
            //
            // 指定した書式で文字列データをフォーマットします。
            //
            Console.WriteLine(string.Format("{0}, {1}", s, s));

            //
            // IndexOfメソッド
            //
            // 指定した部分文字列が存在するポジションを返します.
            //
            // 見つからなかった場合は、-1, 元の文字列がstring.Emptyの場合は0が返ります.
            // 引数にnullを渡した場合、例外が発生します。
            //
            Console.WriteLine("o index of={0}",         s.IndexOf("o"));
            Console.WriteLine("not_found index of={0}", s.IndexOf("not_found"));
            Console.WriteLine("Empty index of={0}",     s.IndexOf(string.Empty));
            // ERROR.
            //Console.WriteLine("null index of={0}", s.IndexOf(null));
            
            //
            // Joinメソッド
            //
            // 指定した配列を指定した区切り文字で結合します。
            //
            Console.WriteLine(string.Join(",", new string[]{"hoge", "hehe", "fuga"}));

            //
            // PadLeftメソッド
            //
            // 左側に指定した文字を指定した文字数になるようにパディングした文字列を返します.
            // 
            // 2つ目の引数に指定するのは、charであることに注意.
            //
            Console.WriteLine("1".PadLeft(5, '0'));

            //
            // PadRightメソッド
            //
            // PadLeftメソッドの逆の方向にパディングします。
            //
            Console.WriteLine("1".PadRight(5, '0'));

            //
            // Replaceメソッド
            //
            // 指定したパターンを全て指定した文字列で置換して返します.
            //
            Console.WriteLine("#NAME#-#AGE#-#NAME#".Replace("#NAME#", "gsf_zero1").Replace("#AGE#", "30"));

            //
            // Splitメソッド
            //
            // 指定した文字列でレシーバーを分割して返します。
            //
            // 分割文字は複数指定できます。
            //
            foreach(string parts in "1,gsf_zero1/30/090-xxxx-xxxx".Split(new char[]{',', '/'})){
                Console.Write(parts + " ");
            }
            Console.WriteLine("");

            //
            // StartsWithメソッド
            //
            // 指定した文字列が該当文字列データの先頭に一致するかどうかを返します。
            //
            Console.WriteLine("hoge".StartsWith("ho"));

            //
            // Substringメソッド
            //
            // 指定した範囲の文字列を切り出します。
            //
            // javaと同じく、元の文字列に変化はありません。
            // (文字列は不変オブジェクトなので常に新たな文字列インスタンスが作成されて返却されます)
            //
            // 始点として指定したインデックスの要素は含まれるということに注意。
            // 終点として指定したインデックスの要素も含まれるということに注意。
            //
            // helloという、5文字を切り取り。
            int startPosition = 2;
            Console.WriteLine("  hello world".Substring(startPosition, (startPosition + 5) - 1));

            //
            // ToLowerメソッド
            //
            // 小文字に変換して返します。
            //
            Console.WriteLine("HELLO WORLD".ToLower());

            //
            // ToUpperメソッド
            //
            // 大文字に変換して返します。
            //
            Console.WriteLine("hello world".ToUpper());

            //
            // Trimメソッド
            //
            // 先頭と末尾に対してトリミングを行った文字列を返します。
            //
            // TrimStartメソッド, TrimEndメソッドはそれぞれ先頭のみ、末尾のみに対してトリミングを
            // 行います。
            //
            //
            Console.WriteLine("'" + "    hello world    ".Trim() + "'");
        }
    }
}


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。