C#重载:null值的方法

时间:2016-05-26 16:13:00

标签: c# overloading overload-resolution

我目前正在为我的一些课程编写序列化程序。 我使用以下签名创建了一组静态方法

public static string serialize(int val);
public static string serialize(string val);
public static string serialize(float val);
public static string serialize(MyOwnClass val);
public static string serialize(AnotherClass val);
public static string serialize(SomethingElse val);

此外,有时我必须处理null值。 我想以一种特殊的方式对待它们,即签名如:

public static string serialize(null val);

对函数的调用应该是这样的:

string s = serialize(someVariableThatMightBeNull);

它应该在serialize被调用时使用值null触发,而与声明变量的类型无关。

有没有办法在C#中实现这个?

目前我唯一的解决方案是将此行添加到每个方法: (对于可以为null的数据类型):

if(val == null){ dealWithNull(); }

这个解决方案看起来有点单调乏味,因为我有大约30种不同的情况,我宁愿没有调度方法。

例如,Xtend功能dispatch methods也提供Void类型,用于检查空值。 Xtend Dispatch Methods

4 个答案:

答案 0 :(得分:3)

如果我理解正确的话:

我使用等待object的方法签名。

编译器将始终选择看起来与您使用的最接近的方法签名。因此,如果没有其他可用的方法,它将仅使用带有object签名的方法。

在此方法中,您将能够检查参数是否为null和/或处理没有自己的静态方法进行序列化的类

对于自定义序列化,恕我直言,我认为最好让每个类自己处理。

为了做到这一点,我要定义一个包含方法ICustomSerialization的接口string CustomSerialization()

然后我需要创建每个类,我需要从这个接口序列化继承并在每个类中实现该方法。

这样可以将序列化代码放在相关类中,避免使用大量序列化类。

允许序列化程序使用接口(因此不必知道如何处理每个特定的类)

答案 1 :(得分:2)

将被调用的方法取决于传入的东西的类型。

如果您输入的内容为string且保留空值,那么它将使用字符串参数命中该方法。如果你有一个MyOwnClass类型的变量并且它是null,那么它将使用MyOwnClass参数点击该方法。

我认为您最好的选择是在代码外部执行此操作。

if(whatever == null) { serializeNull(whatever); } else { serialize(whatever); }

答案 2 :(得分:0)

您当前的解决方案是C#中唯一的解决方案(where you don't have true templates)。

我认为只要样板代码的大小与序列化代码的其余部分相比保持较小,我可能会对此感到高兴。

如果您可以在类和序列化代码之间引入紧耦合,那么您可以采用“OO”方式通过引入处理空值的基类来消除冗余,并使每个派生类覆盖虚拟实施方法。

答案 3 :(得分:0)

所以我有一个类似的问题,除了您的解决方法不适合我,因为我需要对null重载使用不同的返回类型。例如。我需要Tensor == Tensor返回Tensor<bool>,而Tensor == null仅返回bool

我解决该问题的方法是以下技巧,它在以下假设下有效:

  1. Tensor是最具体的类别,通常不应该使用 被继承。
  2. ==以外,引用类型的第二个操作数没有Tensor的重载。

如果是这种情况,那么您可以简单地定义class NullTensor: Tensor,它不能被实例化(仅限私有构造函数),并且具有重载

  • Tensor == NullTensor-> bool
  • Tensor == Tensor-> Tensor

然后,如果您编写(Tensor)x == null,则第一个重载将被替换为第二个重载,因为null可以是TensorNullTensor,但是第二个类型是更具体。