When you write a procedure that has to maintain an internal state between calls, changing it into a class makes sense. As for the name, you change the verb (write) into a noun (writer), and you now have a name for the class.
C# will silently create hidden closure classes for you when you use lambdas or yield.