是的,所以我在这里寻找性能影响/代码风格的答案,所以这可能不是正确的问题。
我从数据库结果中设置了一个DataRow'reader',然后我将值提取到一个对象中。因为对于每个变量,我想检查空值并返回'failure'值,如果它为null,我必须执行检查:
try
{
if (reader[property] != DBNull.Value)
{
var = reader[property];
}
else
{
var = failureValue;
}
}
catch (ArgumentException e)
{
// DISPLAY ERROR ABOUT NO VALUE CALLED Property
var = failureValue;
}
catch (Exception e)
{
// DISPLAY GENERIC ERROR ABOUT VALUE
var = failureValue;
}
在我目前的情况下,我在一个类中执行了47次检查,因此我将代码移动到一个方法然后调用它。重要的是要注意我把它放在我的数据访问类的超类中,这样每个人都可以使用它。
我现在的问题是,当我创建这个方法时,每次调用该方法时,我最初都会传入完整的DataRow'读者'。我应该在超类中创建一个静态变量,并在设置'reader'时设置它吗?因此,允许该方法访问自身内部的静态变量而不必每次都执行完整读取器的传递?或者像this thread建议的那样更改它会更慢?
编辑:由于第一个答案和评论都有疑问,变量确实需要是静态的,因为超类本身从未初始化,只是继承自。答案 0 :(得分:1)
从性能角度来看,如果您一次又一次地通过读取器或将其本地存储到变量中,它根本没有任何区别(可能是一些纳秒,但你不会关心它)。与您在上面提到的帖子中所说的相反,在方法或类本身中将对象存储之间存储对象的位置没有区别。如果它存储在堆栈上,或者堆由其他方式确定。
然而,从API角度来看,您应该问自己,是否需要所有成员(或至少少数)的依赖(在您的情况下是读者),或者只需要一个。我建议将依赖项传递给你真正需要的地方。
另一个appraoch是在第一次调用方法之前通过setter设置依赖关系:
var instance = new MyType();
instance.SetReader(reader);
for(int i = 0; i < 100; i++) instance.DoSomething();
根据您的编辑:仅因为您的基类没有实例化并不意味着它的所有成员都应该是static
。实际上你的基类是实例化的,只要你创建一个子类的新实例(尽管可以转换为基类)。因此,您可以使用由所有派生类继承的常用实例成员。
您可以查看dependecy injection。
答案 1 :(得分:0)
您应该传递实例而不是使用类级别的静态变量。
原因是您希望严格控制范围,从而保持变量的生命周期。您不希望它们存在的时间超出了他们的需要,或者在他们需要的范围之外可用。
让我们暂时不谈数据阅读器的事实 - 例如SqlDataReader
- 实现一次性模式;你仍然会使你的应用程序变得不必要地复杂化。对于具有相对较少的类,方法和变量的小应用程序来说,这似乎并不重要,但是小应用程序习惯于成长为更大,更复杂的应用程序。
正如我在上面提到的,像SqlDataReader
这样的数据读者会实现IDisposable
,这意味着假设使用它们的实例的方式是{{1}声明:
using
这样,即使发生异常,也可以保证读取器在块退出之前进行处理和垃圾收集。需要注意的重要一点是,变量using (var reader = command.ExecuteReader())
{
// ... do stuff
}
仅存在于reader
块的范围内。更窄的范围意味着不仅更容易阅读您的代码并了解在何时何地发生的事情,而且还保证您的变量在不再需要时进行垃圾收集。
想一想:如果你有一个静态的,类级别的变量,什么时候会被垃圾收集?直到应用程序退出。在您遇到内存问题的情况下,这很难调试。