【问题标题】:C#: Simplifying many similar implicit operator methodsC#:简化许多类似的隐式运算符方法
【发布时间】:2011-11-06 04:56:15
【问题描述】:

我有一堂有一堆implicit operators 的课。在下面的代码中,只使用了implicit operators 的几个示例。我正在寻找任何想法如何重构它,而不使 SafeValue 类通用。有什么想法吗?

public class SafeValue {
    private readonly object value;
    public SafeValue(object value) {
        if (value == somethingSpecial) {
            value = null;
        }
        this.value = value;
    }
    public static implicit operator string(SafeValue instance) {
        return (string)instance.value;
    }
    public static implicit operator int(SafeValue instance) {
        if (instance.value == null) {
            throw new InvalidCastException("Cannot convert type");
        }
        return (int)instance.value;
    }
    public static implicit operator int?(SafeValue instance) {
        if (instance.value == null) {
            return null;
        }
        return new int?((int)instance.value);
    }
    public static implicit operator DateTime(SafeValue instance)
        if (instance.value == null) {
            throw new InvalidCastException("Cannot convert type");
        }
        return (DateTime)instance.value;
    }
    public static implicit operator DateTime?(SafeValue instance) {
        if (instance.value == null) {
            return null;
        }
        return new DateTime?((DateTime)instance.value);
    }
}

【问题讨论】:

  • 这门课的目的是什么?
  • 看起来很危险......可能是有史以来最糟糕的命名类,考虑到它可以做什么。
  • 作为注释,在隐式运算符中抛出异常通常不是一个好主意。
  • 你为什么不想让类通用?这种类型的场景对于泛化来说是完美的
  • 最好的重构可能是丢弃该类。不要试图粗鲁,但有时改进某些东西的最好方法就是删除它。

标签: c# generics refactoring operators


【解决方案1】:

正如我在 cmets 中所说,我认为最好完全替换代码。

如果这不是一个选项,您可以考虑以下主要是外观上的更改:

  • 您可能希望摆脱手动抛出的异常。如果在下一行中无论如何都要检查 null 并抛出异常,为什么还要检查呢?无论如何,您都会在其中抛出异常。将 null 转换为 int 导致异常。

  • 为什么都是 new ?不需要他们。只需投射。

  • 无需重复Nullables

    DateTime? dt = (DateTime?) DateTime.Now; 
    

按预期工作

    DateTime? dt = (DateTime?) null; 

也有效(这就是你正在做的事情,因为你 return null; 在你的函数中返回值 DateTime? 在签名中,对吗?

您的所有函数都简化为仅一行代码。这是 DateTime? 的一大亮点:

public static implicit operator DateTime?(SafeValue instance) {    
    return (DateTime?)instance.value;    
}

重复 int? 等。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多