.NETは、ジェネリックを使用してコレクションでオブジェクトを使用しているときにタイプキャストしますか?
-
19-09-2019 - |
質問
.NET CLRは、コレクション宣言に記載されているものにオブジェクトを型切りしていますか?宣言した場合
List<string> lststrs= new List<string>();
lststrs.add("ssdfsf");
.NETは、追加と撤回中にこのオブジェクトをタイプキャストしますか?????
まあ、私は質問自体が誰もが明確に理解していなかったと思います。私を詳しく説明してください。 Javaにはジェネリックがありますが、コードを逆コンパイルすると、コンパイラがコレクションオブジェクトが使用される場所にタイプキャストを配置することに気付くでしょう。 ex:list listofstrings; listofstrings.add( "");文字列値= listofstrings.get(1);クラスファイルを拒否した後、このリストのリストが表示されます。 listofstrings.add( ""); string value =(string)listofstrings.get(1);ここでは、コンパイラが文字列のタイプキャストを触れました。
さて、私の質問は、それが.netで同じかどうかです??
解決
これを意味しますか?
List<string> myList = new List<string>();
リストは一般的なタイプです - 以下のように宣言すると、コンピールエラーが表示されます。
List myList = new List(); //<-- big mama of a compilation error
とにかく - それは一般的なリストであるため、それは強く入力されているので、あなたは文字列ではないものを渡すことができません(そうする場合、それは結果として生じます - 再び - ビッグママ コンパイルエラーの)。
他のヒント
いいえ、リストはここで文字列に強く入力されます。それがジェネリックを使用することの全体的な利点です。
タイプキャストされていません。
Generics Force Type Safteyは、指定されたタイプのオブジェクトのみを一般的なコレクションに追加できるようにします。これらはコンパイラ警告です。
例では、整数などの別のオブジェクトを追加しようとする場合、コンパイラ警告が表示されます。
「リスト」のようなものはありません:)
ただし、aがあります List<string>
. 。ここでは、文字列のコレクションであるため、文字列をキャストしません。
ただし、これを考えてみてください。
List<object> objects = new List<object>();
objects.Add("Hello SO.com");
string myString = objects.First(); //Wont compile, as objects return an object.
//You need to cast it to a string (for example, by using the as operator).
いいえ。コレクションが入力されるため、必要ありません。
タイプキャストはまったく必要ありません。ジェネリックを使用するという事実により、リストは自動的に強く入力されます。
いいえ、そうではありません。 Javaとは対照的に、Die CLRは、型消去を介してではなく、それ自体でgenericsを異なるタイプとして実装します。だから、a List<string>
とは別のタイプです List<int>
, 、そして両方のタイプは、必要に応じて実行時に動的に対処されます。
番号。
list.addの実装を参照してください:
private T[] _items;
public void Add(T item)
{
if (this._size == this._items.Length)
{
this.EnsureCapacity(this._size + 1);
}
this._items[this._size++] = item;
this._version++;
}