在类中包装一个简单类型有什么好处?

时间:2012-09-03 15:08:18

标签: c#

我正在查看基本上传递id的代码,例如:

GetPersonById(int personId)

但它没有使用int,而是使用了PersonId对象。

GetPersonById(PersonId personId)

PersonId对象只是一个带有一些手摇代码的int,使其可以为空。当可嵌入的int不可用时,或者在类中包装简单类型有更高的目的时,这是在旧的.NET中创建的吗?

public sealed class PersonId {

    private PersonId() {
        _isNull = true;
        _value = 0;
    }


    private PersonId(int value) {
        _isNull = false;
        _value = value;
    }

    // and so on!
}

7 个答案:

答案 0 :(得分:16)

在这样的DDD代码中,用于使此ID引用的类型更明确。

特别是在精心设计的聚合环境中,对其他聚合的引用通常是通过ID而不是通过对象引用。在这种情况下,可以使用这些ID值对象来避免意外混合这些ID,并且 - 如前所述 - 使其更明确地引用聚合。

答案 1 :(得分:8)

如果用于识别人员的字段需要更改,则使用类是简化进一步重构的好方法。假设明天系统到达Int32.MaxValue个人,并且您希望使用Int64或字符串来识别它们。另一种情况是,当系统的要求不是100%准确时,他们没有指定是否可以通过ID,PIN或您可以想到的任何字段组合来识别某个人。这段代码的作者可能会通过创建这个类来阻止重大的重构。

答案 2 :(得分:5)

答案也可能是语义!

想象一下,你有一些int值。它是ID吗?或者是年龄,身高(cm),温度(摄氏度),电视节目数量?好吧,你可以给变量一个好名字,但如果你犯了错误,这不会保护你。

相反,如果一个函数需要一个ID类实例(好吧,伪装成int而不仅仅是int,但是你试图错误地传递X坐标值(恰好是int,或者Coordinate的实例,或者其他什么),编译器捕获它并警告你。除此之外,任何阅读代码的人都可以清楚地看到所需的值不是只是 int,而是一个ID - 你不能用文档做得更好,无论如何都没有人读它。

(旁注:你无法想象,我曾经尝试重构使用double代码的角度和角度有多大的头痛!这是一场噩梦!切换到{{1}后一切都好多了。)

答案 3 :(得分:2)

Nullable<T>不存在时,此代码可能是用C#1.0编写的。

现在你应该使用int?

答案 4 :(得分:1)

对我来说,我认为最好使用最原始的框架类型。

- &GT;没有好处

答案 5 :(得分:1)

旧的C#可以解释它 但我猜它可以有其他解释,未来的想法...... 如果将来你希望为一个人拥有更多数据,通过更改PersonId类本身或继承它,所有代码仍然可以正常工作。但如果您使用int?,则必须更改所有电话。

答案 6 :(得分:0)

除了使用值类型为可空之外,没有任何好处。没什么。