After I had changed all my extension methods to be functions and return a new object rather than mutating the self parameter, I changed them all back to be refs.
Why? Well mainly because the library I am writing is in VB, and these methods are internal. VB supports ByRef parameters as the first param in an extension method, so no problems there. The only reason I was changing them so that they were C# compatible was so that I could test them with MSpec in C#. I solved this little dilemma by just calling the extension method on the static class like so:
Because of = () => EnumExtensions.Add(ref testEnum, (int)FlagsTest.Four);
This works, and lets me use the extensions how I think they should work. The real question is why do I think my flags methods (Add, Remove) should mutate the instance, when I am quite happy with string
and DateTime
methods returning new instances? I think it might be in the naming conventions.
A List<T>
has Add
and Remove
methods, which modify the existing instance. SO maybe if I had called my methods WithFlag()
and WithoutFlag()
I wouldn’t have expected mutation? I’m not entirely convinced as DateTime
has AddMinutes
and AddHours
, which don’t mutate and return a new instance. Now that I think about it, that surprised me when I first used them. I think, as usual, it’s down to doing what makes the most sense in the situation.