【问题标题】:Creating object in for loop在for循环中创建对象
【发布时间】:2012-09-28 10:29:28
【问题描述】:

在for循环内部和外部创建对象是否有区别..我不确定,但我遇到了在forloop外部声明oCategoryDe​​finition的错误:

从“System.Int32”到“xxx.CategoryDe​​finition”的无效转换 在 System.Convert.DefaultToType(IConvertible 值,类型 targetType,IFormatProvider 提供程序) 在 System.Int32.System.IConvertible.ToType(Type type, IFormatProvider provider) 在 System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) 在 Service.AddFeatureValues(VINDescription vinDescription, VehicleDescription vehicleDescription)

>

  for (int i = 0; i < listLength; i++)
    {
        CategoryDefinition oCategoryDefinition = (CategoryDefinition)Convert.ChangeType
         (vehicleDescription.genericEquipment[i].Item, typeof(CategoryDefinition));
        vinDescription.StandardFeature.Add(oCategoryDefinition.category.Value);
    }

CategoryDefinition oCategoryDefinition = new CategoryDefinition();

for (int i = 0; i < listLength; i++)
{
   oCategoryDefinition = (CategoryDefinition)Convert.ChangeType
       (vehicleDescription.genericEquipment[i].Item, typeof(CategoryDefinition));
   vinDescription.StandardFeature.Add(oCategoryDefinition.category.Value);
}

编辑

为问题添加一个角度:以下是触发上述错误的方法:

 private void AddFeatureValues(VINDescription vinDescription, VehicleDescription vehicleDescription)
    {
        GenericEquipment[] genericEquipList = null;

        //To add standard features to the vehicle details list.
        CategoryDefinition oCategoryDefinition =  new CategoryDefinition();

        try
        {
            genericEquipList = vehicleDescription.genericEquipment;

            if (genericEquipList != null)
            {
                //Stores the number of items in generic list.
                int listLength = genericEquipList.Length;

                for (int i = 0; i < listLength; i++)
                {
                    //Casting the object type to CategoryDefinition type.
                    oCategoryDefinition = (CategoryDefinition)Convert.ChangeType(vehicleDescription.genericEquipment[i].Item,
                                            typeof(CategoryDefinition));
                    vinDescription.StandardFeature.Add(oCategoryDefinition.category.Value ?? "N/A");
                }
            }
        }
        catch (Exception ex)
        {  
        }
    }

【问题讨论】:

  • 在循环内外创建它的唯一区别是对象/变量范围
  • 您能否详细说明错误消息与您的代码有何关系?
  • 我无法理解其余的问题/问题。请修复它
  • @Johan 除了作用域之外,还有更多的区别——堆分配。但无论如何,这不会是异常的原因。
  • 抱歉不清楚...我已经编辑了问题..再次道歉..

标签: c# c#-4.0


【解决方案1】:

也许尝试以下,因为唯一的主要区别是新关键字。

CategoryDefinition oCategoryDefinition;

for (int i = 0; i < listLength; i++)
{
   oCategoryDefinition = (CategoryDefinition)Convert.ChangeType
       (vehicleDescription.genericEquipment[i].Item, typeof(CategoryDefinition));
   vinDescription.StandardFeature.Add(oCategoryDefinition.category.Value);
}

但是,演员表异常并没有真正帮助我的主张。

【讨论】:

  • 请看问题中的完整方法
  • 异常发生在哪里?它在哪一行中断?
  • oCategoryDe​​finition = (CategoryDe​​finition)Convert.ChangeType(vehicleDescription.genericEquipment[i].Item, typeof(CategoryDe​​finition));
  • 如果你把它改回里面?
  • 哈哈该死的,你还有什么改变?也许是“CategoryDe​​finition”类的东西?
【解决方案2】:

在第二种情况下,由于扩展变量范围(例如方法),您仍然可以引用上次迭代后持续的对象,因此使用第一个版本更安全。

但是(取决于框架如何实现创建引用)它可能会导致轻微的性能影响,这在迭代次数变大时非常重要。

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多