是的,所以我正在寻找性能影响/代码风格的答案,所以这可能不是提问的正确位置。
我从数据库结果中设置了一个 DataRow“读取器”,然后将值提取到一个对象中。因为对于每个变量,我都想检查空值并返回一个“失败”值,如果它是空值,我必须执行检查:
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 次检查,所以我将代码移到一个方法中,然后调用它。重要的是要注意,我将它放在我的数据访问类的父类(super class)中,这样每个人都可以使用它。
我现在的问题是,当我创建这个方法时,我最初在每次调用该方法时都传入了完整的 DataRow“reader”。我应该在父类(super class)中创建一个静态变量并在设置“阅读器”时设置它吗?因此,允许该方法访问自身内部的静态变量,而不必每次都执行完整读取器的传递?还是像 this thread 这样改过来比较慢建议?
编辑:正如第一个答案和评论所质疑的那样,变量确实需要是静态的,因为父类(super class)本身从未初始化,只是继承自。
最佳答案
从性能的角度来看,如果您一次又一次地传递读取器或将其存储在本地变量中,它根本没有区别(可能是几纳秒,但您不会在意)。与你提到的帖子中所说的相反,在方法中或类本身中声明对象之间,对象的存储位置没有区别。是存储在栈上还是堆上,通过其他方式判断。
但是,从 API 的角度来看,您应该问问自己,您的类的所有 成员(或至少几个)是否需要依赖项(在您的情况下是读者),还是只需要一个。我建议在您真正需要它们的地方传递依赖项。
另一种方法是在第一次调用您的方法之前通过 setter 设置依赖关系:
var instance = new MyType();
instance.SetReader(reader);
for(int i = 0; i < 100; i++) instance.DoSomething();
根据您的编辑:仅因为您的基类未实例化并不意味着它的所有成员都应该是static
。实际上,无论何时创建其子类之一的新实例(虽然可以将其转换为基类),您的基类都会被实例化。因此,您可以只使用由所有派生类继承的普通实例成员。
你可以看看dependecy injection .
关于c# - 将变量作为设置传递给类一次还是多次传递? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41763642/