Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在隐式强制转换过程中检查前提条件和执行一些逻辑是一个好主意吗_C# - Fatal编程技术网

C# 在隐式强制转换过程中检查前提条件和执行一些逻辑是一个好主意吗

C# 在隐式强制转换过程中检查前提条件和执行一些逻辑是一个好主意吗,c#,C#,全面实施就在这里 我使用带隐式转换的struct来隐式转换源类型,并通过struct的泛型参数描述检查规则。 从我的观点来看,它可以减少代码重复,并且可以作为dsl阅读 如何使用: static void Main(string[] args) { string s = Size(null);//result: argument exception Console.WriteLine(Lenght(null));//result 0

全面实施就在这里 我使用带隐式转换的struct来隐式转换源类型,并通过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"; ;
    }
static void Main(字符串[]args)
{
字符串s=Size(null);//结果:参数异常
Console.WriteLine(长度(null));//结果0
DivByZero(0);//结果:参数异常
日志(5);//结果:日志5到控制台
AddTenSymbols(“”;//结果:如果结果字符串的长度超过10,则记录结果字符串/
Console.ReadKey();
}
静态检查尺寸(检查obj)
{
返回obj.ToString();
}
静态内部长度(检查str)
{
字符串stri=str;
返回条纹长度;
//返回((字符串)str).Length;
}
静态整数除以零(检查i)
{
返回1/i;
}
静态检查日志(int i)
{
返回i;
}
静态检查AddTenSymbols(字符串s)
{
返回s+“asffgsdfgd”;
}

回答标题问题:不,不要那样做。隐式铸造应该是安全的,而不是抛出

根据C语言规范第6.1节:

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


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

B泰勒是对的,您正在尝试以类型(按名称)捕获逻辑,而您可以轻松地使用lamdba。它们会给你带来更多的灵活性

并且您的方法名称并不表示该方法在做什么-例如,
DivByZero
不是被零除,而是被
i
。。。你的代码也不会毫无例外地运行。我看不出这有什么意义。

通过隐式铸造的目的,你的答案是

但是,由于隐式转换不需要程序员 从一种类型显式转换为另一种类型时,必须注意 防止意外结果。通常,隐式转换运算符 永远不要抛出异常,永远不要丢失信息,以便 可以在程序员不知情的情况下安全使用。如果需要转换 运算符不能满足这些条件,应将其标记为显式


对我来说,它看起来有点过于复杂。你看起来像是使用C类仿制药,比如C++模板,它们是非常不同的动物。您需要创建
Ten
Zero
类/结构的事实应该告诉您,这种方法可能不正确。在C++中代码> 0 和 10 实际上是完美的模板参数,但是当你需要11或17时,这里会发生什么?为什么你会使用这个过代码合同?1。我可以就地创建一个新类,它不是很大:class Illeven:Number{public Illeven():base(11)}2。例如,用空字符串替换空字符串时,代码契约并没有真正的帮助。但是我的代码可以很容易地与代码契约合并,并使用编译时检查等等。这只是一个例子,是的,它令人困惑。