2015-05-23 18 views

Trả lời

17

Tôi biết các hàm nội tại không có giấy tờ sau đây.

Delphi 2007: hereHallvard'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ì 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.

Các vấn đề liên quan