Delphi có danh sách này: Delphi Intrinsic Routines
Nhưng danh sách đó không đầy đủ.Các thói quen nội tại không có giấy tờ
Chức năng nội tại không có giấy tờ nào tồn tại, vì khi nào và mục đích của chúng là gì?
Delphi có danh sách này: Delphi Intrinsic Routines
Nhưng danh sách đó không đầy đủ.Các thói quen nội tại không có giấy tờ
Chức năng nội tại không có giấy tờ nào tồn tại, vì khi nào và mục đích của chúng là gì?
Tôi biết các hàm nội tại không có giấy tờ sau đây.
Delphi 2007: here và Hallvard's blog:
Mặc định
function Default(T: Typeidentifier): value of T;
Trả về đại diện zero kiểu định danh T
.
Các intrinsics sau giới thiệu trong XE7 được giải thích in the XE7 beta blog và bởi Stefan Glienke
IsManagedType
function IsManagedType(T: TypeIdentifier): Boolean;
True nếu T
là một interface
, string
hoặc dynamic array
, hoặc một kỷ lục chứa như vậy. Một lớp có chứa một loại được quản lý sẽ trả về false.
Trong XE6 trở lên, bạn phải sử dụng System.Rtti.IsManaged(TypeInfo(T))
.
HasWeakRef
function HasWeakRef(T: TypeIdentifier): Boolean;
True nếu T
đã được chú thích như [weak]
. Trình biên dịch giữ một danh sách các tài liệu tham khảo [weak]
. Bạn không thể sử dụng move
và các thủ thuật khác với các loại này, vì điều đó sẽ ngăn không cho danh sách yếu được cập nhật.
Trong XE6 trở lên, bạn phải sử dụng System.TypInfo.HasWeakRef(TypeInfo(T))
.
GetTypeKind
function GetTypeKind(T: TypeIdentifier): TTypeKind;
Liệu điều tương tự như PTypeInfo(System.TypeInfo(T))^.Kind;
, tuy nhiên bởi vì nó là một trình biên dịch nội hàm được giải quyết tại compiletime và mã có điều kiện là false sẽ bị tước bởi trình biên dịch.
IsConstValue
function IsConstValue(const Value): Boolean;
True nếu giá trị gia tăng là một hằng số, false nếu không.
Điều này giúp trình biên dịch loại bỏ mã chết vì hàm được đánh giá tại thời gian biên dịch.
Điều này chỉ hữu ích trong các hàm nội dòng, tại đây nó cho phép mã được tạo ngắn hơn.
TypeInfo
function TypeInfo(T: typeindentifier): PTypeInfo;
Chức năng này không được cung cấp tài liệu như vậy, nhưng những gì là không có giấy tờ là nó là một chức năng nội tại từ XE7.
Điều đó có nghĩa là đoạn mã if TypeInfo(T) = TypeInfo(byte) then ...
không tạo ra bất kỳ mã nào nếu T không phải là một byte và kiểm tra sẽ được giải quyết tại thời gian cộng.
Tuy nhiên, độ phân giải thời gian biên dịch chỉ hoạt động bên trong các thường trình chung và chỉ khi thực hiện kiểm tra if (TypeInfo(T) = TypeInfo(sometype)
.
Bài kiểm tra if TypeInfo(byte) = TypeInfo(smallint) then
không bị loại trừ ngay cả khi nó luôn luôn đánh giá sai.
Cũng không sử dụng khác TypeInfo(T)
.
ReturnAddress
Sau đây được sử dụng với các raise exception at returnaddress
xây dựng.
function ReturnAddress(Expression): pointer; //Delphi ?
function AddressOfReturnAddress(Expression): pointer; //Delphi ?
Và theo như tôi biết, bạn không thể gọi trực tiếp từ mã người dùng.
Ví dụ về IsConstValue
type TFlavor = (Tasty, Nasty); TIntegerHelper = record helper for integer function GetSomething(Flavor: TFlavor): TPoint; inline; private function GetTastyPoint: TPoint; function GetNastyPoint: TPoint; end; function TIntegerHelper.GetSomething(Flavor: TFlavor): TPoint; begin if IsConstValue(Flavor) then begin if Flavor = Tasty then Result:= Self.GetTastyPoint else Result:= Self.GetNastyPoint; end else begin Assert(1=0, 'This function can only be called with constant parameters'); end; end; procedure Test; var pt: TPoint; begin pt:= 100000.GetSomething(Tasty);Cuộc gọi này sẽ được dịch sang GetTastyPoint và trình tựif/then
sẽ được loại bỏ bởi các mối liên kết.