强类型整数

Nei*_*ell 5 design-patterns strong-typing

作为一个爱好项目的思想实验,我一直在想一种方法来确保不会发生这种微妙的错误/错字:

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!
}
Run Code Online (Sandbox Code Playgroud)

这个bug很难找到,因为没有编译时错误,你甚至不一定会在运行时获得异常.你只会得到"意想不到的结果".

为了以简单的方式解决这个问题,我尝试使用空枚举定义.有效地使用户id成为一种数据类型(没有像一个类或一个结构那么远):

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!!
}
Run Code Online (Sandbox Code Playgroud)

你觉得怎么样?

Nia*_* C. 6

如果你要创建新的类型的麻烦持有UserIdUseCaseId,你几乎可以作为很容易使他们成为简单的类和使用隐式转换操作符从int给你你想要的语法:

public class UserId
{
    public int Id { get; private set; }

    public UserId(int id)
    {
       id_ = id;
    }

    public static implicit operator UserId(int id)
    {
        return new UserId(id);
    }

    public static void Main()
    {
        UserId id1 = new UserId(1);
        UserId id2 = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就可以获得类型安全性而无需使用强制转换来丢弃代码.


Jul*_*s A 1

我个人认为没有必要说实话。
开发人员必须正确实现逻辑,不能依赖编译时错误来解决此类错误。