Delphi:为什么类变量会影响方法的结果?

Delphi:为什么类变量会影响方法的结果?,delphi,Delphi,这是我的代码的一个完全简化,但即使如此,当类var ID_计数器存在时,它也不起作用,在这段代码中,我不使用类var,但在我的实际代码中,是的,但只是存在这个类变量 使“s”的结果不同。这是我见过的最奇怪的一次 这里是一个简化,但仍然不起作用,一个单位75行 unit Umain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Gr

这是我的代码的一个完全简化,但即使如此,当类var ID_计数器存在时,它也不起作用,在这段代码中,我不使用类var,但在我的实际代码中,是的,但只是存在这个类变量 使“s”的结果不同。这是我见过的最奇怪的一次

这里是一个简化,但仍然不起作用,一个单位75行

 unit Umain;
 interface
 uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,     Vcl.StdCtrls,XMLIntf,XmlDoc,IOUtils,XMLDom,System.Generics.Collections;

type
  TStore = class
  public
   class var ID_COUNTER: Integer;
   MainNode: IDomNode;
  constructor create(node:IDomNode);
   function getNode():IDomNode;
 end;
TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
 FMain: TStore;
   function Recursive(node:IDomNode):TStore;

 end;

 var
    Form1: TForm1;

 implementation

 {$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Doc:IXMLDocument;
  content: WideString;
  html: IDomNode;
  s: String;
 begin
    Doc := TXMLDocument.Create(Application);
    Doc.LoadFromFile('C:\temp\example.xml');
    Doc.Active := true;
    html := Doc.DOMDocument.getElementsByTagName('html').item[0];
    FMain := Recursive(html);
    s := FMain.getNode().nodeName;
 end;

 function TForm1.Recursive(node: IDOMNode):TStore;
 var
   i: Integer;
   store: TStore;
  nodeName,nodeValue:String;
 begin
   store := TStore.create(node);

  if(not node.hasChildNodes)then
    Exit(store);

   for i := 0 to node.childNodes.length-1 do
   begin
     Recursive(node.childNodes.item[i]);
   end;

  Exit(store);
end;
constructor TStore.create(node: IDOMNode);
begin
  self.MainNode := node;
end;
function TStore.getNode:IDomNode;
begin
  Result := self.MainNode;
end;

end.
一些注意事项:

xml只是一个简单的HTML文档。
当ID_计数器存在时,一切都被破坏,如果它被注释,一切都正常。它发生在这里,也发生在我的真实和广泛的项目中。

问题是,从语法上讲,
类变量
引入了类字段块,而不是单个类字段,这意味着如果使用
类变量
,那么同一可见性部分中的所有后续字段声明也将是类变量所以现在,
MainNode
也变成了一个类变量
,这可能会导致您遇到的问题。重新格式化代码可以更清楚地显示这一点:

public
  class var 
    ID_COUNT: Integer;
    MainNode: IDomNode;
  constructor Create(... etc.
你的选择是:

  • ID\u计数向下移动一行:

    public
      MainNode: IDomNode;
      class var ID_COUNTER: Integer;
      constructor Create(... etc.
    
  • main节点创建一个特殊部分

    public
      class var ID_COUNTER: Integer;
    public
      MainNode: IDomNode;
      constructor Create(... etc.
    
  • 带有
    var
    关键字的序言
    MainNode
    (同样,它在当前可见性部分中引入了一个块,特别是一个实例字段块):


未使用的类变量只能在代码以其他方式被破坏时影响行为。例如,在初始记忆中阅读。请出示SSCCE。否则就没有可操作的问题了。嗨,大卫,谢谢你回答这个问题,我是新来的,我不知道SSCCE是什么意思,我可以更新一些小项目吗?你可以使用websearch来查看SSCCE工具,我忘了,我是Delphi XE5的,也许这会有帮助。未使用的类变量在所有版本中都没有影响。时间到了。学习如何制作sscce是学习如何调试的第一步。您还可以使用普通的
var
来引入实例变量+1在花了两天时间试图找到解决方案后,我花了几个小时在谷歌上搜索,最后我发现了问题所在。是的,未使用的类变量可能会影响您的代码,如果有人检查我的代码,可以验证这一点。这个解决方案太简单了,改变类变量的顺序,只是放在其他变量之后,而不是之前。我不知道delphi是否应该在这种情况下发出警告,并允许您的代码失败。@user-编译器为什么要警告您?很有可能你会故意使用不止一个类变量。协作来改进答案是为什么这么好的论坛。无论是来自评论、新答案还是编辑其他答案,都是为了用户的利益。@rudyvelthui您应该希望您的答案被编辑。我喜欢他们被编辑。我的答案中可能有95%以上的修改会让它们变得更好。这是件好事。
public
  class var 
    ID_COUNTER: Integer;
    // any other class variables
  var 
    MainNode: IDomNode;
    // any other instance variables
  constructor Create(... etc.