這是我的示例代碼:爲什麼從一個點這個拷貝數據錯誤
type
PData = ^TData;
TData = record
str : string;
strlist : TStringList;
end;
var
P1 : PData;
P2 : PData;
P3 : PData;
P4 : PData;
begin
New(P1);
New(P2);
P1.str := 'string';
// copy
P2^ := P1^;
P2.str := P2.str + '_copy';
Memo1.Lines.Add('This is P1:' + P1.str); //This is P1:string
Memo1.Lines.Add('This is P2:' + P2.str); //This is P2:string_copy
// so change P2'Data didn't change P1's Data
// but this :
New(P3);
New(P4);
P3.str := 'string';
P3.strlist := TStringList.Create;
P3.strlist.Add('one line');
// copy
P4^ := P3^;
// just add P4's data
P4.strlist.Add('two line');
Memo1.Lines.Add('P3''s Data:' + IntToStr(P3.strlist.Count));
Memo1.Lines.Add(P3.strlist.Text);
Memo1.Lines.Add('P4''s Data:' + IntToStr(P4.strlist.Count));
Memo1.Lines.Add(P4.strlist.Text);
{
P3's Data:2
one line
two line
P4's Data:2
one line
two line
}
end;
爲什麼當有class
複製點數據,它會改變原始數據,但如果數據是string
使用P1^ := P2^
複製點數據不會更改原始數據。
想想這個的最好方法是考慮'string'是一個值類型。它具有值類型語義,即使實現很時髦。如果你有一個智能模型,把'string'放在'Integer'和'Double'的類中,那麼你就不會出錯。 –