Home / 記事 / プログラム言語 / C# / C# の配列と文字列 (3/3)

e知識「e-chishiki.com」では、インドでの著名なIT著者、IT教育者、eセキュリティーの大家により作成された様々な種類のプログラミング言語に関する技術的なコンテンツを知識情報データーベースとして提供します。

C# プログラミングシリーズ

C# の配列と文字列 (3/3)

Yashavant Kanetkar
Yashavant Kanetkar

インデックス

おそらく、配列と文字列はプログラミング言語自体と同じくらい古いものです。あまりにも長い歴史があるため、ほとんど注目されることさえなくなっています。C# を学習するときには、このような誤りを犯さないでください。C# での配列と文字列は、昔からあるものとは異なり、いっそう強力になっています。何もない状態から言語を開発し、古い言語との互換性を保証する必要がなければ、このような結果になるのは当然のことですが。

文字列

string 型は、C# の定義済みデータ型であり、System.String クラスのエイリアスです。したがって、どちらを使用してもかまいません。string 型のインスタンスは、Unicode 文字の文字列を表します。次のステートメントは、string オブジェクトに値を代入する方法を示しています。

string s = "Hello" ;

ここで、参照 s はスタック上に作成されますが、s によって参照されるオブジェクトはヒープ上に作成されます。C# は、引用符と @ 引用符の 2 種類の string 変数をサポートしています。引用符で囲まれた文字列は通常の文字列で、エスケープ シーケンスをサポートします。コンパイラにエスケープ シーケンスを処理させたくない場合は、@ 引用符を使用できます。この文字列は、string の前に "@" という記号を付けることで作成します。@ 引用符の主な利点は、パス名の表現が簡単になることです。次に例を示します。

string s2 = @"C:\Articles\text.txt" ;

@ 記号をこの文字列の前に付けないと、すべての "\" を "\\" に置き換える必要があります。ただし、次のような文字列で、エスケープ シーケンスを処理する必要がある場合は、@ 記号を前に付けることはできません。

string s1 = "hi \t there" ;

コンパイラは、"\t" を検出するとタブを出力します。したがって、出力は次のようになります。

hi there

2 つの参照変数間で代入操作を使用すると、一方の変数に格納されているオブジェクトへの参照が、他の参照変数にコピーされます。しかし、文字列の場合はそのようにはなりません。参照型であっても、string 変数の代入操作では、新しいオブジェクトが作成されます。右辺の文字列オブジェクトの値が新しいオブジェクトにコピーされて、この新しいオブジェクトへの参照が、代入演算子の左辺にある参照変数に代入されます。この例を次に示します。

using System;
namespace sample
{
    class Class1
    {
        static void Main ( string[ ] args )
        {        
            string s1 = "Good Morning" ;
            string s2 ;
            s2 = s1 ;
            s1 = "Wake Up" ;
            Console.WriteLine ( s1 ) ;
            Console.WriteLine ( s2 ) ;
        }
    }
}

このプログラムの出力は次のようになります。

Wake up
Good Morning

このプログラムでは、2 つの string 参照 s1s2 を作成しました。s1 は "Good Morning" を含むオブジェクトへの参照で初期化し、s2 は初期化しません。続いて、s1s2 に代入します。通常は、どちらの参照も、s1 に代入されていた参照になるはずです。しかし、そうはなりません。実際には、s1 が参照するオブジェクトに格納されていたものと同じ値を保持する新しいオブジェクトが作成されます。

System.Array と同様に、System.String クラスでも文字列に対する一般的な操作を実行するためのさまざまなメソッドが定義されています。次のプログラムでは、System.String のメソッドの使用方法を示します。

using System ;
namespace sample
{
    class Class1
    {
        static void Main ( string[ ] args )
        {
            string s1 = "kicit" ;
            string s2 = "Nagpur" ;
            Console.WriteLine ( "Char at 3rd position: " + s1 [ 2 ] ) ;
            string s3 = string.Concat ( s1, s2 ) ;
            Console.WriteLine ( s3 ) ;
            Console.WriteLine ( "Length of s3: " + s3.Length ) ;
            s3 = s3.Replace ( 'p', 'P' ) ;
            Console.WriteLine ( s3 ) ;
            s3 = string.Copy ( s2 ) ;
            Console.WriteLine ( s3 ) ;
            int c = s2.CompareTo ( s3 ) ;
            if ( c < 0 )
                Console.WriteLine ( "s2 is less than s3" ) ;
            if ( c == 0 )
                Console.WriteLine ( "s2 is equal to s3" ) ;
            if ( c > 0 )
                Console.WriteLine ( "s2 is greater than s3" ) ;
            if ( s1 == s3 ) 
                Console.WriteLine ( "s1 is equal to s3" ) ;
            Else
                Console.WriteLine ( "s1 is not equal to s3" ) ;
            s3 = s1.ToUpper( ) ;
            Console.WriteLine ( s3 ) ;
            s3 = s2.Insert ( 6, "Mumbai" ) ;
            Console.WriteLine ( s3 ) ;
            s3 = s2.Remove ( 0, 1 ) ;
            Console.WriteLine ( s3 ) ;
            int fin = s1.IndexOf ( 'i' ) ;
            Console.WriteLine ( "First index of i in s1: " + fin ) ;
            int lin = s1.LastIndexOf ( 'i' ) ;
            Console.WriteLine ( "Last index of i in s1: " + lin ) ;
            string sub = s1.Substring ( fin, lin ) ;
            Console.WriteLine ( "Substring: " + sub ) ;
            int i = 10 ;
            float f = 9.8f ;
            s3 = string.Format ( "Value of i : {0} \nValue of f : {1}", i, f ) ;
            Console.WriteLine ( s3 ) ;
        }
    }
}

このプログラムでは、2 つの string 参照 s1s2 を作成し、それぞれ "kicit" および "Nagpur" に初期化します。[ ] 演算子は、string の個別の文字にアクセスします。したがって、3 番目の文字にアクセスするには s1[ 2 ] と記述する必要があり、文字列 s1 の場合は文字 "c" になります。

Concat( ) メソッドは static メソッドで、2 つの文字列を連結して新しいオブジェクトを返します。例では、これを s3 に格納しています。したがって、s3 で参照されるオブジェクトには、"kicitNagpur" が格納されています。文字列の Length プロパティは、文字列の文字数を返します。このプログラムの s3 の長さは 11 です。Replace( ) メソッドは、文字列に含まれる特定の文字 (1 番目のパラメータで指定) をすべて、2 番目のパラメータで指定する文字に置き換えます。この例では、s3 で参照されている文字列に含まれる "p" を "P" に置き換えています。

Copy( ) メソッドは static メソッドであり、ある string オブジェクトから別のオブジェクトにすべての文字をコピーします。コピー先の文字列の長さが小さい場合は、自動的に長さが増やされます。

CompareTo( ) メソッドは、2 つの文字列をアルファベットとして比較します。つまり、アルファベット "a" で始まる文字列は常に、アルファベット "b" で始まる文字列より小さくなります。CompareTo( ) メソッドは、このメソッドを呼び出した文字列オブジェクトに含まれる文字列が、メソッドのパラメータとして参照を渡されたオブジェクトに含まれる文字列より小さい場合は、負の整数を返します。string オブジェクトの大小関係が逆の場合は、正の値を返します。両方の文字列が等しい場合はゼロを返します。

同様に、== 演算子は、2 つの文字列を比較して、等しい場合は bool 型の true を返し、等しくない場合は false を返します。

ToUpper( ) メソッドは、新しいオブジェクトを作成し、大文字に変換した文字列を格納して、このオブジェクトのアドレスを返します。例では、このアドレスを s3 に格納しています。この場合、s1 は変化しないことに注意してください。このように、文字列を操作するメソッドの呼び出しに使用したオブジェクトは、その操作による影響を受けません。

Insert( ) メソッドは、2 番目のパラメータで指定した文字列を、1 番目のパラメータで指定したインデックス位置に挿入します。この場合も、s1 は変更されず、返される文字列を s3 に格納しています。したがって、s3 の内容は "NagpurMumbai" になります。

Remove( ) メソッドには 2 つの引数を渡します。1 番目のパラメータは要素の削除を開始する位置のインデックスで、2 番目のパラメータは削除する要素の総数です。この例では 0 と 1 を渡しており、s3 から 0 番目の要素のみを削除することを意味します。したがって、文字列 s3 の内容は "agpur" になります。

IndexOf( ) メソッドは、配列内で特定の文字が最初に出現する位置のインデックスを返します。同様に、LastIndexOf( ) メソッドは、配列内で特定の文字が最後に出現する位置のインデックスを返します。例では、最初の "i" のインデックスは 1 で、最後のインデックスは 3 です。

Substring( ) メソッドは、1 番目のパラメータで渡すインデックスから、2 番目のパラメータで渡すインデックスまでを、新しい文字列として返します。

Format( ) メソッドは、書式指定子 ({0}、{1} など) を string 表現に置き換えます。これは static メソッドであり、書式を設定された文字列を返します。

注意する必要があるのは、== 演算子では大文字と小文字が区別されないことです。Compare( ) メソッドと CompareTo( ) メソッドは、string クラスの異なるメソッドです。Compare( ) は static メソッドですが、CompareTo( ) はそうではありません。Compare( ) メソッドは、最後のパラメータとして true を渡すことで、大文字と小文字を区別しないようにすることができます。コードの例を次に示します。

string str1 = "hello" ;
string str2 = "HELLO" ;
bool chk1 = ( str1 == str2 ) ; //returns false
int chk2 = ( String.Compare ( str1, str2, true ) ) ; // returns 0

コメント

コメントするにはログイン、もしくはユーザ登録を行ってください。

発売中

LET US C(上)
インド人ITエンジニアのCプログラミングのバイブル。通算100万冊以上売れています。
― 2,520円 ―

Y. Kanetkar

発売中

Introduction to Object Oriented Programming & C++
C++を例に、多彩なサンプルコードと簡潔な説明でOOPプログラミングの実際が理解できる。
2,940

Y. Kanetkar

発売中

Microsoft .NET Web Application Security
APプログラムの作り方で不正侵入の防御率を向上させる手法を解説。今までにないセキュリティーの手法を紹介します。
3,990円

Vijay Mukhi

2008年の11月発売予定

Quest C++ ビジュアルラーニングコース
これがあれば、見て聞くだけで楽しみながらプログラミングテクニックが身につきます。
― 9,975円 ―

Y. Kanetkar Asang Dani

2008年の11月発売予定

Programmer's Guide to Web Application Security
Web System への侵入方法と原理を解説する事により、防止方法を理解することが出来る。
3,990

Vijay Mukhi

フォーラムの最新ポスト