代码之家  ›  专栏  ›  技术社区  ›  Peter Turner

Casting Using(object as tclass)和Tlass(object)有什么区别?

  •  17
  • Peter Turner  · 技术社区  · 15 年前

    有个问题在哪里 MyObj.classnameis(TMyClass.classname) 是真的,而且 TMyClass(MyObj) 有效,但 (MyObj as TMyclass).doSomething 引发转换错误。

    我真的不想对那些垃圾有任何帮助,不过如果你想把它写在评论里,那就太棒了。我只是想知道两者之间的区别 Obj as Class Class(Obj) 是。

    2 回复  |  直到 10 年前
        1
  •  31
  •   Mason Wheeler    15 年前

    as-cast检查实际的对象类型以确保强制转换有效,否则会引发异常。“硬铸件”( TMyClass(MyObj) style)不进行检查,它只是告诉编译器假定强制转换是有效的。

    如果您遇到这样一种情况:classname返回true,但as-cast失败,这意味着您在两个不同的单元中有两个同名的不同类,而as-cast试图强制转换到错误的类。这也意味着你的硬石膏是铸造错误的一个,这可能会导致记忆腐败。

    运行一个完整的项目搜索“tmyclass=”来查看您的多个声明在哪里,或者重命名其中一个类,或者使用一个完整的定义(obj作为myUnit.tmyclass),这样编译器就会知道您要强制转换到哪个类。

        2
  •  5
  •   Ken Bourassa    15 年前

    梅森的职位: 除了搜索代码之外,您还可以在出现问题的位置调用类似于此方法的方法。

    function GetClassInheritance(Obj : TObject) : string;
    var ClassRef : TClass;
    begin
      Result := '';
      ClassRef := obj.ClassType;
      Result := ClassRef.ClassName;
      ClassRef := ClassRef.ClassParent;
      while assigned(ClassRef) do
      begin
        Result    := ClassRef.ClassName + '.' + Result;
        ClassRef  := ClassRef.ClassParent;
      end;
    
      Result := '(' + obj.ClassType.UnitName + ')' + Result
    end;
    

    这将返回一个格式为(unitname)to对象.tppersistent.tcomponent…. 我不记得在旧版本的Delphi中看到了“classtype.unitname”,所以这个部分可能不适用于它们,但其他部分应该适用。

    推荐文章