Difference between revisions of "Nullable types"

From Lazarus wiki
Jump to navigationJump to search
Line 73: Line 73:
 
NullableString = TNullable<string>;
 
NullableString = TNullable<string>;
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== See also ==
 +
* [[How to use nullable types]]
  
 
== External links ==
 
== External links ==
  
 
* [https://www.arbinada.com/en/node/1439 Nullables in Free Pascal and Delphi]
 
* [https://www.arbinada.com/en/node/1439 Nullables in Free Pascal and Delphi]
* [[How to use nullable types]]
 

Revision as of 19:43, 28 May 2019

English (en) suomi (fi)

Nullable types are types which can have no value (can be unassigned). One such type in Pascal is Pointer type which can have nil value which means that it isn't assigned to any specific address. Same behavior can be implemented using generic types and advanced records with operator overloading.

unit Nullable;

{$mode delphi}{$H+}

interface

uses
  Classes, SysUtils;

type
  TNullable<T> = record
  private
    FHasValue: Boolean;
    FValue: T;
    function GetValue: T;
    procedure SetValue(AValue: T);
  public
    procedure Clear;
    property HasValue: Boolean read FHasValue;
    property Value: T read GetValue write SetValue;
    class operator Implicit(A: T): TNullable<T>;
    class operator Implicit(A: Pointer): TNullable<T>;
  end;

implementation

{ TNullable }

function TNullable<T>.GetValue: T;
begin
  if FHasValue then
     Result := FValue
  else
    raise Exception.Create('Variable has no value');
end;

procedure TNullable<T>.SetValue(AValue: T);
begin
  FValue := AValue;
  FHasValue := True;
end;

procedure TNullable<T>.Clear;
begin
  FHasValue := False;
end;

class operator TNullable<T>.Implicit(A: T): TNullable<T>;
begin
  Result.Value := A;
end;

class operator TNullable<T>.Implicit(A: Pointer): TNullable<T>;
begin
  if A = nil then Result.Clear
  else raise Exception.Create('Pointer value not allowed');
end;

end.

Then you can define nullable types like:

NullableChar = TNullable<Char>;
NullableInteger = TNullable<Integer>;
NullableString = TNullable<string>;

See also

External links