c# - 字符串或其他密封类的强类型

标签 c# string inheritance strong-typing

我用通用术语来表述我的示例,因为它无需深入探讨我的具体问题细节就可以理解要点。

假设您有一堆将字符串作为参数的方法。假设一个字符串是一个人的“名字”,另一个是一个人的“姓氏”。可能还有其他字符串,例如“最喜欢的食物”。

现在,在您的代码中,您不断发现运行时错误,因为您混淆了参数。您可以调换“名字”和“姓氏”的顺序,或者在您应该使用另一个时使用其中一个。强类型语言的值(value)在于它会在构建时而不是运行时发现这些错误。

因此,一种可能的解决方案是仅从字符串派生类。

public class FirstName : String
{
}

public class LastName : String
{
}

现在,如果您传递了错误类型的字符串,编译器会报错。 以上是不可能的,因为 String 是密封的。 此外,“using”语句将不起作用(我认为),因为当我将它们混淆时编译器不会提示。

using LastName = String;

当然,我可以构建包装字符串的类,然后编写强制转换方法,但这似乎比它值得的麻烦多了。

最佳答案

我不知道您的目标是什么,但您似乎对此很认真 :) 因此一个可能的解决方案是使用通用容器类。它确实不如从密封类继承舒服。

public class Container<T>
{
    public T Value { get; protected set; }

    public Container(T value)
    {
        Value = value;
    }
}

public class FirstName : Container<string>
{
    public FirstName(string firstName) : base(firstName) { }
}

public class LastName : Container<string>
{
    public LastName(string lastName) : base(lastName) { }
}

public class Age : Container<int>
{
    public Age(int age) : base(age) { }
}

public class Program
{
    public void Process(FirstName firstName, LastName lastName, Age age)
    {

    }
}

关于c# - 字符串或其他密封类的强类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877272/

相关文章:

c# - 从文本框中输入的字符串中读取所有字符,不重复并计算每个字符

Java文本分割算法

java - 对于带有继承的 @OneToMany Hibernate 映射,插入失败

grails - Grails中多少个域类继承太多?

"subclass"中的 Javascript 构造函数,正确的表示法?

c# - 添加自定义声明在 ASP.NET Core Identity 中不起作用

c# - 使用 C# 的半非托管代码

c# - 如何为多个服务创建事务 'Wrapper'?

c# - 无法写入已关闭的 TextWriter

C:动态初始化一个常量字符串数组