UPDATE: I do understand basic C# concepts, I must be explaining this poorly...
Stream = Reference Type, pointer to location in memory that holds the actual object
Parameter = Passed as the type of the object (Stream is still a Reference type, and int would be a value type)
Ref Parameter = Allows manipulation of parameter that will persist outside the method block
In looking at this some more and running some tests, it appears the answer depends on what I am trying to do. This question helped me distinguish what I was trying to do for my tests: How can I get an extension method to change the original object?
For most of my helpers, extension methods work great since they can return the answer and I don't need to replace the original object. For other helpers, I am better off using a method with a ref parameter so I can update the original object. I could make the extension mimic the ref parameter by returning a new object, but doing so is a memory penalty given the extra allocation.
Contemplating some of the helper classes I have created, I was wondering if there are any functional or performance differences between extensions and methods with a ref parameter. Especially with something large like streams, my first though was that passing the stream by ref would be more performant when running different validations on said stream, but extension methods also have a reference like signature in that they are static.
static bool IsValidSize(this Stream stream, long size)
bool IsValidSize(ref Stream stream, long size)
So are there any functional or performance differences between these two method signatures?