Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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#_Oop_Mvvm - Fatal编程技术网

C# 我如何在可注入助手类和静态助手类之间做出决定?

C# 我如何在可注入助手类和静态助手类之间做出决定?,c#,oop,mvvm,C#,Oop,Mvvm,假设我的ViewModel有一个IsValidEmail属性,我想将电子邮件验证逻辑提取到单独的类中以供重用 我是将此电子邮件验证类设置为可注入类还是将其设置为静态帮助器类 我想听听这两种方法的利弊 我是将此电子邮件验证类设置为可注入类还是将其设置为 静态助手类 它是一个视图模型(或)只是一个POCO类,那么为什么不能在需要的地方实例化它(或)在需要的任何验证方法中传递该类型的实例。决定静态和实例之间的经验法则 如果您100%确定不希望函数/属性的行为具有多态性,那么静态将是一个很好的选择。例如

假设我的ViewModel有一个IsValidEmail属性,我想将电子邮件验证逻辑提取到单独的类中以供重用

我是将此电子邮件验证类设置为可注入类还是将其设置为静态帮助器类

我想听听这两种方法的利弊

我是将此电子邮件验证类设置为可注入类还是将其设置为 静态助手类


它是一个视图模型(或)只是一个POCO类,那么为什么不能在需要的地方实例化它(或)在需要的任何验证方法中传递该类型的实例。

决定静态和实例之间的经验法则

如果您100%确定不希望函数/属性的行为具有多态性,那么静态将是一个很好的选择。例如,返回PI(3.14)值的函数可以是静态的,因为它是通用静态常数

实例方法/属性可以被重写,并且可以表现为多态性(可以在运行时更改行为)。如果您想要一个被重写的行为,那么static将没有帮助,因为static方法无法重写,因为名称表明它是静态的。示例:假设您要创建一个计算组织中员工工资的函数。根据员工指定,薪资计算将有所不同。在这种情况下,您不能使用静态函数,因为根据对象,薪资计算会有所不同

在您的示例中,电子邮件验证可以是静态的,因为不管验证对象是静态的。这里的一个问题是,您在父级上编写的单元测试将始终触发验证,因为您不能模拟静态


如果不确定函数/属性的行为是否具有多态性,请始终使用实例方法/属性。只有当您完全确定静态类时,才可以使用它。

静态类更难进行单元测试。仅出于这个原因,你可能决定不这样做。此外,静态类通常用于共享状态,但若您只有逻辑,那个么并没有很好的理由将其设置为静态。