我真的不知道该怎么说,但我对性能感到困惑
我有从字典中读取的变量。但有时它可以包含null。
例如,我有以下内容:
Dictionary<string,object> DataRow = new Dictionary<string,object>();
上一行是从数据库表中读取行,并将其提取到字典中。
现在我们可以说我们有以下列:“ StudentID:int
”,“ StudentName:varchar
”,“ IsPaid:bit
”
有时列可以为空。而且我不想使用可空值:
现在我尝试执行以下操作: 第一种方法
var StudentIDObject = DataRow["StudentID"];
var StudentID = StudentIDObject is null ? 1 : Convert.ToInt32(StudentIDObject);
var IsPaidObject = DataRow["IsPaid"];
var IsPaid = IsPaidObject is null ? true : Convert.ToBoolean(IsPaidObject); // note that sometimes null well be true depending on option behaviour.
我认为之前的代码还可以,并且性能很好。但这不是可读性。根据我有超过25个变量。我只举一个简单的例子。
为什么不使用以下代码? 第二种方法
var StudentID = DataRow["StudentID"] is null ? 1 : Covnert.ToBoolean(DataRow["StudentID"]);
Note,上一行将两次调用字典索引器。我认为它会再次在字典中搜索。这会泄漏性能吗?
我应该使用第一种方法还是第二种方法?以及为什么?
请注意,我有25个以上的变量。这样我就可以找出阅读时哪个表现更好?有关系吗? ...
请参见参考.NET源。 Dictionary总是在索引器调用时循环。
public TValue this[TKey key] {
get {
int i = FindEntry(key);
if (i >= 0) return entries[i].value;
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set {
Insert(key, value, false);
}
}
private int FindEntry(TKey key) {
if( key == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (buckets != null) {
int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i;
}
}
return -1;
}
我对演奏的看法是,没关系。与访问数据库相比,C#的速度基本上无关紧要(特别是在您目前的编码经验中)。
我对可读性的看法是这样:
您应该具有一个从DataRow读取每种类型的值并将其转换为正确类型的函数:
var StudioId = ReadAsInt(DataRow["StudentId"]);
var IsPaid = ReadAsBoolean(DataRow["IsPaid"]);
比您的版本容易阅读。当然,您将需要这些功能,例如:
int ReadAsInt(object value)
{
return value is null ? 1 : Convert.ToInt32(value);
}
int ReadAsBool(object value)
{
return value is null ? true : Convert.ToBoolean(value);
}