Нужно разъяснение относительно действия <T> - PullRequest
1 голос
/ 09 апреля 2011

Вот метод, используемый для сохранения данных в файл, который поставил меня в тупик:

public void SaveData(string filename, Action<StreamWriter> saveAction)

Документация для библиотеки описывает второй параметр как «действие делегата для обработки фактической записи данных». Однако я заблудился о том, как создать действие для StreamWriter. Я провел некоторое исследование и обнаружил, что много подобных вещей используется в качестве примеров для Action<T>:

Action<string> s = Console.WriteLine;

И из этого я заключаю, что <T> - это тип передаваемого параметра, а Action - метод, который принимает этот параметр. Я знаю, что это может быть ужасно неправильно.

В основном, все, что я хочу сделать, это использовать StreamWriter.WriteLine(string line). Тем не менее, я не могу использовать

Action<StreamWriter> s = StreamWriter.WriteLine;

Потому что это не имеет смысла, плюс я все равно не могу ссылаться на StreamWriter.WriteLine. Сейчас я думаю, что должен быть метод, который берет StreamWriter из класса, о котором я не знаю. Если кто-нибудь захочет указать мне правильное направление, я буду очень признателен.

Вы можете спросить, почему я не могу просто создать свой собственный StreamWriter и сделать это так, как я всегда это делал. Что ж, я работаю в XNA на Zune, поэтому запись в текстовый файл на самом деле довольно сложна при всех уровнях защиты (все приложения находятся в «песочнице»), а библиотеки, которые я сейчас использую, обещают сделать его гораздо более упрощено, если я могу просто понять, как эффективно использовать Action<T>. Кроме того, я хочу учиться и быть лучше подготовленным к использованию делегатов в будущем.

1 Ответ

6 голосов
/ 09 апреля 2011

Вероятно, API предназначен для использования следующим образом:

SaveData(filename, writer => writer.WriteLine(saveData));

Нотация => кратко объявляет анонимную функцию. Вы могли бы написать это более длинным способом как это:

private static void SaveToWriter(StreamWriter writer)
{
    // get saveData somehow
    writer.WriteLine(saveData);
}

// ...

SaveData(filename, SaveToWriter);

, который может помочь в объяснении сигнатур типов.

...