我应该先存储需要转换为变量的数据吗?或不止一次调用字典索引器?

问题描述 投票:0回答:1

我真的不知道该怎么说,但我对性能感到困惑

我有从字典中读取的变量。但有时它可以包含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# .net dictionary memory-management collections
1个回答
0
投票

我对演奏的看法是,没关系。与访问数据库相比,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);
}
© www.soinside.com 2019 - 2024. All rights reserved.