[fpc-devel] "Default" discussion for SmartPointers etc
    Maciej Izak 
    hnb.code at gmail.com
       
    Thu Jul 28 17:49:26 CEST 2016
    
    
  
2016-07-28 16:37 GMT+02:00 Michael Van Canneyt <michael at freepascal.org>:
>
> Are there additional benefits I have missed ?
>
>
Using nilable (I think nilable is better than nullable) records is terrible
without default field:
=== code begin ===
var
  n: TNilable<TRec>;
  x: TRec;
begin
  {
   ... let say that n is assigned somewhere, assume that n.HasValue = true
  }
  // to change any field in nilable n  you need to...
  x := n.Value;
  x.foo1 := 10;
  x.foo2 := 'abc';
  n := x;
end.
=== code end ===
instead of:
=== code begin ===
var
  n: TNilable<TRec>;
begin
  {
   ... let say that n is assigned somewhere, assume that n.HasValue = true
  }
  x.foo1 := 10;
  x.foo2 := 'abc';
end.
=== code end ===
> I can live with the 'ascetic' version :-)
>
> Since the following:
>
> Procedure SomeTest(Var X : Integer);
>
> begin
>   X:=1; end;
>
> Var
>   A : TNullable<Integer>;
>
> begin
>   SomeTest(A^);
> end.
>
> Will lead to a crash on a null value, I don't think this is a very good
> idea to add.
> We should protect users from crashes, not expose them to it :-)
>
that will change nothing, just look below. Just harder to usage pure
non-pascalish clone of C# struct (finally C# has pointers as
nonstandard/unsafe type so feature with direct dereference is disabled by
design).
=== code begin ===
procedure SomeTest(x : Integer);
begin
end;
Var
  A : TNullable<Integer>;
begin
  SomeTest(A.Value); // AV error here!
end.
=== code end ====
A^ is shortcut for A.Value but has advantage = direct dereference to
Instance.
-- 
Best regards,
Maciej Izak
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20160728/79aff96c/attachment.html>
    
    
More information about the fpc-devel
mailing list