Что такое общие коллекции в С#?
Я пытаюсь создать свой первый общий список и столкнуться с некоторыми проблемами. Я понимаю, что декларация выглядит как "List<T>
", а у меня using System.Collections.Generic;
в верхней части моей страницы. Однако Visual Studio не распознает переменную T
.
Что мне не хватает?
Ответы
Ответ 1
List<T>
означает List<WhateverTypeYouWantItToBeAListOf>
. Так, например:
Если у меня есть класс Employee, и мне нужна коллекция сотрудников, я могу сказать:
List<Employee> employeeList = new List<Employee>();
Затем я мог бы добавить Employee
Объекты в этот список и быть безопасным по типу и распространяться на многие объекты-работники, которые я вложил в него.
Так же:
Employee emp1 = new Employee();
Employee emp2 = new Employee();
employeeList.Add(emp1);
employeeList.Add(emp2);
employeeList
теперь содержит emp1
и emp2
как объекты.
Существует несколько граней для общих коллекций, наиболее важными из которых являются независимый от объекта способ иметь... ну... коллекцию объектов. Они безопасны по типу; что любая коллекция будет состоять из одного типа объектов. У вас не будет экземпляра Animal
внутри List<Employee>
(если, конечно, Employee не является базовым классом, на который наследуется Animal
. В то же время у вас больше проблем.
Программирование с помощью Generics - это его собственная тема, достойная (по крайней мере) одной главы книги. На очень высоком уровне программирование с помощью дженериков предоставляет другой способ повторного использования кода - независимо от любой иерархии классов или деталей реализации конкретного класса.
Подробнее здесь.
Ответ 2
Вам нужно подставить T
для другого типа, такого как int
, string
или класс вашего создания:
List<int> values = new List<int>();
values.Add(1);
values.Add(2);
int secondNumber = values[1]; // Yay! No casting or boxing required!
Ответ 3
Например, если вам нужен общий список целых чисел (int
), вы должны написать:
List<int> list = new List<int>();
T
- это параметр типа, который в вашем коде должен быть фактическим.
Ответ 4
Что делает общий родовой список - факт, что вы можете использовать тот же класс для создания списка яблок и списка картофеля. Конечно, как только вы создадите список с помощью оператора new
, вам нужно решить, какие объекты вы хотите сохранить и сообщить о своем решении, поместив имя типа объектов, которые вы храните в <>
.
Следующая строка на самом деле говорит компилятору:
List<Employee> employeeList = new List<Employee>();
"Эй, мне нужен список, который может обрабатывать объекты типа Employee
и называется employeeList
!"
Объект списка, который вы получаете таким образом, больше не является общим. Он будет принимать и возвращать объекты типа Employee
. Но поведение списка определяется "общим" способом, который не заботится о том, с какими объектами он работает. Он просто называет их "T
" внутренне, потому что для всего, что должен делать список, тип содержимого не имеет большого значения.
Ответ 5
Рассмотрим T
как имя переменной. Вы должны указать его значение, т.е. сделать общий класс "конкретным". Таким образом, вы можете создавать List<string>
, List<int>
или List
все, что хотите.
Ответ 6
Вы объявляете список объектов Foo следующим образом:
List<Foo> fooList;
В имени типа это местозаполнитель для "реального" типа объекта, который вы вставляете в общий список в момент его создания.
Ответ 7
Эта статья на MSDN должна вам очень помочь.
Ответ 8
Когда вы выполните List<Object>
, убедитесь, что класс Object является общедоступным. В установках VS по умолчанию классы выходят из окна как "внутренние" - это означает, что вы не можете составить их список, потому что они менее доступны, чем открытый список, который вы объявляете.
Это меня вчера.... Глупые значения по умолчанию.
Ответ 9
Вы пытаетесь использовать класс List или пытаетесь создать свой собственный? Как выглядит ваш код на данный момент?