S
skyweb
Unregistered / Unconfirmed
GUEST, unregistred user!
to dirk and jacket84:
我印象里面Delphi编译器会成编译的时候禁止对属性进行地址操作,以保证对象的封装性,但事实却正如二位指出的那样,似乎是件很奇妙的事情。我做了个简单的测试程序:
program a;
type
TClassA = class(TObject)
private
FVarA: string;
public
property VarA: string read FVarA;
end;
procedure test;
var
ca: TClassA;
p: ^String;
begin
ca:=TClassA.Create;
p:=@ca.VarA;
p^:='Hello, World!';
WriteLn(ca.VarA);
end;
begin
test;
end.
结果一个只读的属性,也可以是不只读的,只要我们直接对它的地址赋值就好了。我原以为是Delphi新引进的一个Bug,但是FreePascal下也可以运行通过……
但是为什么呢?
如果允许像上面一样操作只读属性的话,似乎可以做出很多奇奇怪怪的事情来。比如:
procedure TForm2.Button1Click(Sender: TObject);
var
list: TList;
pc: PInteger;
i: Integer;
begin
list:=TList.Create;
pc:=@list.Count;
pc^:=5;
list.Add(Self);
list.Free;
end;
各位有什么想法?
我印象里面Delphi编译器会成编译的时候禁止对属性进行地址操作,以保证对象的封装性,但事实却正如二位指出的那样,似乎是件很奇妙的事情。我做了个简单的测试程序:
program a;
type
TClassA = class(TObject)
private
FVarA: string;
public
property VarA: string read FVarA;
end;
procedure test;
var
ca: TClassA;
p: ^String;
begin
ca:=TClassA.Create;
p:=@ca.VarA;
p^:='Hello, World!';
WriteLn(ca.VarA);
end;
begin
test;
end.
结果一个只读的属性,也可以是不只读的,只要我们直接对它的地址赋值就好了。我原以为是Delphi新引进的一个Bug,但是FreePascal下也可以运行通过……
但是为什么呢?
如果允许像上面一样操作只读属性的话,似乎可以做出很多奇奇怪怪的事情来。比如:
procedure TForm2.Button1Click(Sender: TObject);
var
list: TList;
pc: PInteger;
i: Integer;
begin
list:=TList.Create;
pc:=@list.Count;
pc^:=5;
list.Add(Self);
list.Free;
end;
各位有什么想法?