2012-01-08 20 views
0

私はArrayList(C#)に関する質問がありますが、私は答えを知っていると思いますが、確認が必要だと思います。私は知識の堅実な基礎を望んでいます。だからここArrayListの説明

は私の質問です: 私はのArrayListの例を見て、このコード行に出くわしました。ここで

for (int i=1; i<=items.Count; i++) 
{Console.WriteLine("{0}. {1}", i, (String)items[i-1]);} 

は、私は何が起こっているのか知っていると思うものです。

  1. forループは、ArrayListの各項目に対して実行されます。
  2. 実行されるコードは、仮パラメータを使用してコンソールのWriteLineメソッドへのメソッド呼び出しです。
  3. {0}はforループのiの現在の値に置き換えられ、{1}は[i - 1]のArrayListインデックスの値に置き換えられます。
  4. の理由[I - 1]のArrayListのインデックスは0から始まり、ではない。ここ1

が、私はわからない程度だものですのでです。 1.(String)< <これは、現在のArrayListインデックスの値をString型にキャストしていると思いますか? 2. ArrayListアイテムのタイプは何ですか?それは単なるオブジェクト型ですか?

コンセプトは、私には少し霧であり、私はちょうど明確さのビットを探しています。何か助けてくれてありがとう。

+2

スタートではなく、System.Collections.Generic名前空間の一覧 ''の例を見ています。 'ArrayList'は、あなたがレガシー1.1コードで作業しているのでない限り、優先するコレクション型ではありません。 –

+0

'ArrayList'は緩やかに型付けされたコレクションであり、' object'型のオブジェクトを格納します。 'Console.WriteLine'がオブジェクトの' ToString() 'メソッドを呼び出すことによってシーンの裏側でこのキャストを実行するので、'(String)items [i-1] 'の'(String) 'は不要です。 –

+0

ArrayListよりも一般的にはC#についてもっと尋ねているようですね。 –

答えて

3

配列とリストは、C#で0でインデックス付けされています。これは、最初のアイテムがインデックス0にあり、最後のアイテムがインデックスitems.Count - 1にあることを意味します。

for (int i = 0; i < items.Count; i++) 
{ 
    Console.WriteLine("{0}. {1}", i + 1, (string)items[i]); 
} 

ArrayListのインデクサがobjectの戻り値の型を持っているので、あなたのリストには、フェッチするときに、通常の文字列にキャストすることになるでしょう文字列が含まれている場合:0から始め、あなたのループの場合、私はあなたのコードがより明確になると思いますArrayListのオブジェクトです。しかし、この具体的なケースでは、WriteLine overloadにはvoid WriteLine(string, object, object)の署名が付いているので、キャストを実行する必要はありません。このメソッドにobjectを渡すだけで問題ありません。内部的にはWriteLineメソッドはオブジェクトにToStringを呼び出します。

また、ArrayListの代わりにList<T>という汎用クラスを使用することを検討する必要があります。 ArrayListクラスは.NETが最初にリリースされたときに便利でしたが、.NET 2.0以降の新しいコードではList<T>を使用することをお勧めします。

2

このループは非標準的な方法で行われているため、コンセプトは少し霧がかかります。 C#で配列/リストをループの慣用的方法は、0の開始インデックス

for (int i = 0; i < items.Conut; i++) { 
    String current = (String)items[i]; 
    Console.WriteLine("{0}. {1}", i + 1, current); 
} 

とそうすることでそれはしかし項目+ 1のインデックスを印刷するためのコードのビット虚偽と思われる(これコードが行うことです)。このコードの原作者は、0

0
  1. (文字列)< <このIは、の値をキャストされると信じて始まるのCLR/C#の方法対1から始まるインデックスされるアレイとより身近であると思われます現在のArrayListインデックスをString型に変換しますか?

(String)が正しくキャストされています。このキャストによると、yesのArrayListにはString型のオブジェクトが含まれている必要があります。それ以外の場合は、classcastexceptionがあります。

  1. ArrayListアイテムのタイプは何ですか?それは単なるオブジェクト型ですか?

arraylistのタイプはStringのオブジェクトである必要があります。

0

リスト内のオブジェクトのタイプを定義するリストとは異なり、ArrayListsはジェネリックではありません。

内部ではであり、ArrayListはその値を格納するためにタイプobjectの配列を使用しています。私たちのコードでは、その値をList<object>と宣言したかのように扱わなければなりません。型がobject過ぎて定義されていないので、我々はそうでない場合、コンパイラは型として扱いますので、(この場合はすなわちStringobjectのサブクラスとしてそれらを定義する場合

ので、我々は値をキャストする必要がありますobjectString操作を実行することはできません。


注:オブジェクトのToString()メソッドが暗黙的に呼び出されますので、この場合、キャストは必要ないかもしれないが、我々は他のString操作(すなわちSubstring)を実行したい場合は、私たちが実際にキャストが必要になります。

0

あなたの分析は正しいです。

.NET Framework 1.0および1.1にはジェネリックがありませんでした。このためArrayListのため、この時点からの日付はobjectタイプです。 .NET 2.0以降では、汎用のList<T>が利用可能となり、ほとんどの場合、古いArrayListが廃止されました。

は、その後、あなたがドロップキャスティングすることができます

var items = new List<string>(); 

としてあなたのリストを定義します。

0
  1. はい、i-1によるarraylist参照の個々の要素の文字列へのキャストです。これは、arraylistの各要素が文字列であると仮定しています。存在しない場合、invalidcastexceptionがスローされます。いずれかの要素がnullの場合、null参照例外がスローされます。私はあなたが操作の優先順位に関する不確実性のために質問していると思います。優先順位を知らなくても、arraylistの要素を文字列にキャストしているのか、arraylist自身にキャストしているのか混同することができます(無効キャスト例外がスローされます)。前に述べたように、この場合、tostringはconsole.writelineによって呼び出されるので不要です。

  2. はい、arraylistはオブジェクトのリストです。前にも述べたように、ジェネリックスは、より具体的にタイプ項目のリストを持つ機能を提供します。

また、何も価値がないので、インデックスが1のループを開始することは不便です。あなたが0で始まり、< =ではなく、ループ継続条件として<を使用すると、人生は通常より良いでしょう。インデックス自体を使用する必要がない場合は、foreachループを使用する方がよいでしょう。

0

私は、forループのArrayList内の各項目に対して実行される

  1. 厳格な説明を与えるためにしようとするでしょう。

ループは私< = items.Countが真のままの状態である限り実行を継続します。

  1. 実行されるコードは、仮パラメータとコンソールのWriteLineメソッドのメソッド呼び出しです。

フォーマルパラメータは、メソッドのシグネチャで宣言したものです。メソッドに渡すパラメータは、実際のパラメータと呼ばれます。

  1. {0} forループで、iの現在の値に置き換えされ、{1}のArrayListのインデックスの値と4を交換する[I - 1]。

{0}及び{1} ToStringメソッドの値に置き換えられます()Console.WriteLineを

理由の第二及び第三の位置に渡されるパラメータの呼出し以下のために[私は - 1]のArrayListのインデックスは0から始まりされているためと右のない1

これは私が確信していることです。 1.(String)< <これは、現在のArrayListインデックスの値をString型にキャストしていると思いますか?

あなたは正しいです。これは鋳造です。また、このキャストは必要ありません(Console.Writelineは引数にToString()を呼び出します)。 arraylistの項目がString以外のタイプの場合、InvalidCastExceptionが発生します。

  1. ArrayListアイテムのタイプは何ですか?それは単なるオブジェクト型ですか?

は右