У меня есть два вопроса:Должен ли я действительно использовать IEnumerable? Что такое System.Collections.IEnumerator?
Первый вопрос:
Я написал сканер, который генерирует поток токенов по требованию с помощью синтаксического анализа.
public class Scanner
{
public IEnumerator<Token> GetEnumerator()
{ //DO SOME STUFF HERE
yield return new Token(...);
}
}
public class Parser
{
IEnumerator<Token> iterator;
...
public Parser(Scanner scanner)
{
this.iterator = scanner.GetEnumerator();
...
}
public Token nextToken()
{
//generate the next token
iterator.MoveNext();//there is no need to test MoveNext()
return iterator.Current;//get the generated token
}
...
}
Учитывая, что это на самом деле единственный случай, когда я использую класс сканера в целом рамки, как вы думаете, что это нормально или было бы более правильным, что Scanner
реализует IEnumerable
?
Если я не ошибаюсь, компилятор выполнит некоторую операцию, чтобы сделать сканер IEnumerable в любом случае, это правильно?
Второй вопрос:
Пусть Scanner
реализует IEnumerable
, то код будет выглядеть следующим образом:
public class Scanner:IEnumerable<Token>
{
public IEnumerator<Token> GetEnumerator()
{
...
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();//I'M NOT SURE OF THIS!
}
То, что я не понимаю, в чем смысл IEnumerable.GetEnumerator()
и если моя реализация правильно или нет. Я знаю, что это необходимо, так как Scanner
реализует IEnumerable<T>
, а не IEnumerable
(в противном случае GetEnumerator() было бы достаточно, но тогда на Current
я должен был сделать неэффективное понижение от объекта к токену).
Может ли кто-нибудь его exaplain?
Спасибо за ваш ответ на второй вопрос! У меня для вас два вопроса: 1. как насчет первого вопроса? 2. Есть какая-то особая причина, потому что я должен реализовать 'IEnumerable.GetEnumerator()' по-другому? – justHelloWorld
IEnumerable - это не просто наследие. Он позволяет перечислять объекты. Это не общий, а обобщенный способ перечисления. – TIKSN
@TIKSN довольно много наследия. 'IEnumerable