在隐式转换期间检查前置条件并执行某些逻辑是一个好主意

时间:2011-10-23 10:05:01

标签: c#

全面实施https://gist.github.com/1306491 我正在使用带隐式转换的struct来隐式转换为源类型和从源类型转换,并通过结构的泛型参数描述检查规则。 从我的角度来看,它可以减少代码重复,并可以作为dsl读取。

使用方法:

    static void Main(string[] args)
    {
        string s = Size(null);//result: argument exception
        Console.WriteLine(Lenght(null));//result 0
        DivByZero(0);// result: argument exception
        Log(5);//result: log 5 to console
        AddTenSymbols("");//result: if result string has lenght more than 10 then log result string/ 
        Console.ReadKey();
    }

    static Check<string, IsNotNull<string>> Size(Check<object, IsNotNull<object>> obj)
    {
        return obj.ToString();
    }

    static int Lenght(Check<string, AndReplaceByEmptyIfNull> str)
    {
        string stri = str;
        return stri.Length;
        //return ((string)str).Length;
    }

    static int DivByZero(Check<int, If<int, EqualsTo<Zero>, ThenThrowArgumentException<int>>> i)
    {
        return 1 / i;
    }

    static Check<int, If<int, BothTrue<Not<EqualsTo<Zero>>, Not<MoreThan<Ten>>>, ThenLog<int>>> Log(int i)
    {
        return i;
    }
    static Check<string, If<string, Member<string, int, StringLenght, MoreThan<Ten>>, ThenLog<string>>> AddTenSymbols(string s)
    {
        return s + "asffgsdfgd"; ;
    }

3 个答案:

答案 0 :(得分:2)

回答标题问题:不,不要这样做。隐式转换应该是安全的并且不要抛出

来自C#语言规范,§6.1:

  

预定义的隐式转换始终成功,永远不会导致   要抛出的异常。正确设计的用户定义隐式   转换也应该表现出这些特征。

因此,如果您确实需要验证,请将其设为显式转换。

答案 1 :(得分:1)

MSDN documentation并且出于隐式投射的目的,您的答案是

  

但是,因为隐式转换不需要程序员   明确地从一种类型转换为另一种类型,必须注意   防止意外结果。一般来说,隐式转换运算符   永远不应该抛出异常,永远不要丢失信息   可以在没有程序员意识的情况下安全使用。如果转换   运营商不能满足那些标准,应该明确标明

答案 2 :(得分:0)

B Tyler是对的,你正在尝试捕捉类型(按名称)的逻辑,而你可以轻松地使用lamdbas。它们将为您带来更多灵活性。

并且您的方法名称没有表达方法正在做什么 - 例如DivByZero不是除以零而是i ...并且您的代码不会毫无例外地运行。我没有看到这一点。