C# 在IF条件中实例化对象

C# 在IF条件中实例化对象,c#,asp.net,.net,wcf,coding-style,C#,Asp.net,.net,Wcf,Coding Style,我有一个类,它有一个CheckValuessomeVar方法,该方法在接受一个首先被检查为null或空的参数后返回true或false。在运行IIS的WCF服务中以及在多线程应用程序中调用此类的方法。以下两种方法中哪一种更好 1: 2: 第一种方法非常传统。第二种方法的好处是,仅当变量someVar具有某些值时才创建对象,否则就不创建对象 第二种方法是否有问题,或者是不好的做法?这个变量是值类型还是引用类型有关系吗?第二个代码片段本身并没有什么不好的地方。事实上,正如您所注意到的,这将是一个小的

我有一个类,它有一个CheckValuessomeVar方法,该方法在接受一个首先被检查为null或空的参数后返回true或false。在运行IIS的WCF服务中以及在多线程应用程序中调用此类的方法。以下两种方法中哪一种更好

1:

2:

第一种方法非常传统。第二种方法的好处是,仅当变量someVar具有某些值时才创建对象,否则就不创建对象


第二种方法是否有问题,或者是不好的做法?这个变量是值类型还是引用类型有关系吗?

第二个代码片段本身并没有什么不好的地方。事实上,正如您所注意到的,这将是一个小的优化比第一

也就是说,它闻起来很难闻。为什么要创建一个只供一次使用的对象来调用一个没有参数的方法?该方法是否应该是静态的,因为它不需要状态?是否应该重用现有对象

我看到的主要问题是,这种逻辑的存在表明设计中的其他地方存在问题

对于您的评论:

参数的存在并不会真正改变气味;因为您仍在为单个函数调用创建一次性使用对象

考虑到你的第二点意见,这个设计可能是合理的。确保该对象只生成处理检查所需的状态。如果它是某个大型对象,那么您只需要免费引入一堆开销


您可以使用CheckValues静态方法,这样就不必使用类的对象来调用它。

是的,静态方法似乎更好,除非有什么东西排除了这一点。在运行IIS的WCF服务的上下文中,当多个请求可能间接调用该方法时,该方法是否有效。该方法实际上接受一个参数。我会很快更新这个问题。我一般回答了你的问题,如果有详细信息,那么就与大家分享。因此,我们应该以这些形式控制原教旨主义者,避免他们随机向下投票,而不从他们预定义的向下投票的有效理由列表中给出有效理由!我认为这是合理的,而且是一种投票权,尽管你可能会争辩说它的观点是基于这是一个好的设计吗?这通常取决于你问谁+1/-2也不算太糟糕,尽管我也总是喜欢在被否决时得到评论。我同意布拉德利的看法。否决票应该规定一个理由……实际上,该方法有一些参数。我不确定这是否重要,所以没有把完整的代码放在那里。我将简短地更新这个问题,进一步回答您的问题:为什么要创建一个只用于一次用途的对象..这个类有一个方法,可以在应用程序的其他地方使用,所以我不希望它的逻辑留在这个类中。它接受一个变量,该变量将根据后端数据库进行检查。我在这里不考虑静态类,因为我希望该类在web或多线程环境中工作。在当前的工作范围内,该方法将只调用一次。我只需要检查我发送的一些值。这个类也有其他的方法,但对于这个特定的工作范围来说并不重要。为了简单起见,我想检查字符串username是否已登录。这个函数也可以在其他地方使用,但这里只使用一次。我只需要一次。只有在一个类中多次使用对象时才应该创建对象吗?我不希望我的PrintUserActivityReport类检查登录的用户,因为这可能违反单一责任。。PrintUserActivityReport应仅在被告知时打印UserActivity。有时它可能是为登录用户打印的,有时则可能不是。这可能不是显示调用MyClass的PrintUserActivityReport类与执行相同操作无关的最佳示例。此外,MyClass.CheckValuessomeVar也将用于其他类。我不想在PrintUserActivityReport类中使用该逻辑。@user20358同样,答案是这取决于具体情况。听起来这是一个DB访问类,所以实例化和调用一个函数可能很好,因为不会有太多开销。如果这是一个不同类型的对象,我的答案会有所不同。对于您的场景,您可能还可以。
MyClass obj = new MyClass();

if( !String.IsNullOrEmpty(someVar) && obj.CheckValues(someVar))
{
    ...
}
if( !String.IsNullOrEmpty(someVar) && new MyClass().CheckValues(someVar))
{
    ...
}