【问题标题】:Instantiate an object in an IF condition在 IF 条件下实例化对象
【发布时间】:2014-10-07 16:49:00
【问题描述】:

我有一个类,它有一个方法CheckValues(someVar),它在接受一个首先检查为空或为空的参数后返回真或假。此类的方法在从 IIS 运行的 WCF 服务中调用,也在多线程应用程序中调用。以下两种方式哪个更好?

1:

MyClass obj = new MyClass();

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

2:

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

第一种方法非常传统。第二个让我只有在变量someVar 具有某些值时才创建对象的好处,否则没有。

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

【问题讨论】:

  • SO 应该真正控制这些“格式原教旨主义者”,避免在不从他们预定义的有效理由拒绝投票列表中给出有效理由的情况下随机投反对票!
  • 我认为这是合理的(并且是赞成票),尽管您可以根据其意见提出争论(这是一个好的设计吗?通常取决于您问谁)。 +1/-2 还不错,虽然我也总是喜欢在被否决时得到评论。
  • 我同意布拉德利。否决票应该说明理由......

标签: c# asp.net .net wcf coding-style


【解决方案1】:

第二个代码 sn-p 本身并没有什么坏处。事实上,正如您所指出的,这将是第一次的小优化。

也就是说,它闻起来很糟糕。你为什么要创建一个完全用于一种用途的对象,来调用一个没有参数的方法?该方法是否应该是静态的,因为它不需要状态?您应该只重用现有对象吗?

我看到的主要问题是该逻辑的存在表明您的设计中的其他地方存在问题。

致你的cmets:

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

  2. 鉴于您的第二条评论,该设计可能是合理的。确保该对象什么都不做,但生成处理检查所需的状态。如果是一些大对象,你只是白白地引入了一堆开销。

【讨论】:

  • 方法其实是有参数的。我不确定它是否重要,所以没有把完整的代码放在那里。我会尽快更新问题
  • 进一步查询:“你为什么要为一个用途创建一个对象..”,该类有一个方法可以在应用程序的其他地方使用,所以我不想要它留在这个类的逻辑。它需要一个变量,该变量将根据后端数据库进行检查。我在这里没有考虑静态类,因为我希望这个类也可以在 Web 或多线程环境中工作
  • 在当前工作范围内,该方法只会被调用一次。我只需要检查我发送的一些值。该类也有其他方法,但对于这个特定的工作范围并不重要。为了简单起见,让我们说一下,我想检查字符串用户名是否已登录。此功能也可以在其他地方使用,但这里只有一次。我不需要它超过一次。只有在一个类中多次使用对象时才应该创建对象?
  • 我不希望我的 PrintUserActivityReport 类检查登录的用户,因为这可能违反单一职责。PrintUserActivityReport 应该只在被告知时打印 UserActivity。有时可能会为已登录的用户打印,有时可能不会。这可能不是展示调用 MyClass() 的 PrintUserActivityReport() 类如何与执行相同操作无关的最佳示例。 MyClass().CheckValues(someVar) 也将用于其他类。我不想在 PrintUserActivityReport() 类中有这个逻辑。
  • @user20358 同样,答案是视情况而定。听起来这是一个数据库访问类,所以实例化和调用一个函数可能没问题,因为不应该有太多的开销。如果这是一种不同的物体,我的答案会有所不同。对于您的方案,您可能没问题。
【解决方案2】:

您可以创建CheckValues() 静态方法,然后您不必创建类的对象来调用它。

【讨论】:

  • 是的,静态方法似乎更好,除非有什么东西排除了这一点。 msdn.microsoft.com/en-us/library/79b3xss3.aspx
  • 当多个请求可能间接调用该方法时,它将在运行 IIS 的 WCF 服务的上下文中工作。该方法实际上接受一个参数。我会尽快更新问题..
  • 我回答了你的问题,如果有详细信息,请分享。
猜你喜欢
  • 2019-08-02
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多