I C# People…

October 8, 2009

Strongly-typed ints

Filed under: C#, Design — Neil Barnwell @ 6:00 pm

Weird title, no? I couldn’t think of a snappier one, I’m afraid.

I’ve been thinking of a way to ensure that this sort of subtle bug/typo doesn’t happen:

public void MyMethod(int useCaseId)
{
   // Do something with the useCaseId
}

public void SomeOtherMethod()
{
   int userId = 12;
   int useCaseId = 15;
   MyMethod(userId); // Ooops! Used the wrong value!
}

This bug would be hard to find because there’s no compile-time error, and you wouldn’t necessarily even get an exception at run-time. You’d just get “unexpected results”.

To resolve this in a simple way, I’ve experimented with using empty enum definitions. Effectively making a user id a datatype (without going quite as far as a class or a struct):

public enum UseCaseId { // Empty... }
public enum UserId { // Empty... }

public void MyMethod(UseCaseId useCaseId)
{
   // Do something with the useCaseId
}

public void SomeOtherMethod()
{
   UserId userId = (UserId)12;
   UseCaseId useCaseId = (UseCaseId)15;
   MyMethod(userId); // Compile error!!
}

What d’you think?

Blog at WordPress.com.