Метод, который возвращает коллекцию, вызывается на каждой итерации в выражении foreach в C #? - PullRequest
7 голосов
/ 28 января 2009

Сегодня утром я работал с кодом C #, и у меня было что-то вроде:

foreach(DataRow row in MyMethod.GetDataTable().Rows) {
//do something
}

Итак, поскольку у меня нет полного понимания языковой структуры, я хотел бы знать, вызывается ли GetDataTable () каждый раз, когда выполняется итерация, или он вызывается только один раз, и получаются данные (которые будут строкой) сохраняется в памяти, чтобы пройти через него. В любом случае я объявил новую коллекцию, чтобы сохранить ее и работать оттуда ...

Я добавил новую переменную, вместо этого я сделал:

DataRowCollection rowCollection = MyMethod.GetDataTable().Rows;
foreach(DataRow row in rowCollection) {
//do something
}

Но я не совсем уверен, если это необходимо.

Заранее спасибо.

Ответы [ 5 ]

11 голосов
/ 28 января 2009

Не беспокойся об этом; он будет выполнять GetDataTable () только один раз внутри страны, чтобы получить объект перечислителя из DataRowCollection, а затем извлекать новый элемент из него при каждом запуске цикла.

3 голосов
/ 29 января 2009

Цикл foreach - это только синтаксический сахар для

var enumerator = MyMethod.GetDataTable().Rows.GetEnumerator();
while (enumerator.MoveNext())
{
    DataRow row = enumerator.Current;
    // Initial foreach content
}
2 голосов
/ 28 января 2009

Густаво - перефразируя моего старого профессора CS: отладчик - твой друг! Если у вас есть несколько минут и немного терпения, вы можете перенести извлечение таблицы в другой класс и установить там точку останова. Вы обнаружите, что действительно объект создается так, что вызов не повторяется.

1 голос
/ 28 января 2009

Он вызывается только один раз, а затем сохраняется.

0 голосов
/ 28 января 2009

То, что вы делаете, по сути одно и то же. В первой ситуации вы создаете ссылку на класс DataRowCollection, а затем запускаете foreach, а в первой вы не создаете ссылку. В обеих ситуациях вы вызываете .GetEnumerator () для экземпляра DataRowCollection, находящегося в куче.

Вы будете вызывать его для экземпляра после извлечения экземпляра из метода GetDataTable ().

GetDataTable () вызывается только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...