Modern C# allows you to declare output variables inline; this has a subtle benefit of making TryFoo
methods more attractive and cleaning up your code. Consider this:
public class FooCollection : ICollection<Foo> { // ICollection<Foo> members omitted for brevity public Foo GetFoo(string fooIdentity) { return this.FirstOrDefault(foo => foo.Identity == fooIdentity); } } // somewhere else in the code var foo = foos.GetFoo("dave"); if (foo != null) { foo.Fight(); }
Our GetFoo
method will return a default of Foo
if one isn’t found that matches fooIdentity
— code that uses this API needs to know that null
indicates that no matching item was found. This isn’t unreasonably, but it does mean that we’re using two lines to find and assign our matching object. Instead, let’s try this approach:
public class FooCollection : ICollection<Foo> { public bool TryGetFoo(string fooIdentity, out Foo fighter) { figher = this.FirstOrDefault(foo => foo.Identity == fooIdentity); return fighter != null; } }
We’ve encoded the knowledge that null
means “not found” directly into our method, and there’s no longer any ambiguity about whether we found our fighter or not. Our calling code can now be reduced by a line:
if (foos.TryGetFoo("dave", out foo)) { foo.Fight(); }
It’s not a huge saving on its own, but if you have a class of several hundred lines that’s making heavy use of the GetFoo
method, this can save you a significant number of lines, and that’s always a good thing.