null this, classes, methods and "null this" assertion

ketmar via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 10 18:59:28 PDT 2015


let's take a code like this:

import std.stdio;

class A {
  size_t len = 42;
  final size_t length () const { return (this !is null ? len : 0); }
}

void main () {
  A a;
  writeln(a.length);
  a = new A();
  writeln(a.length);
}

in "-release" mode this code outputs "0" and "42", as expected (by me).
but without "-release" is raises "null this" assertion.

while such check *may* be useful, it actually does nothing at all for 
virtual functions (if we'll remove `final` from `length`, we'll get 
segfault), and prevents writing non-virtual functions that can do 
something sane for "null objects".

my example with `length` actually has sense, as it mimicking the built-in 
array behavior. instead of writing

  if (obj !is null && obj.length > 0)

i can simply write:

  if (obj.length > 0)

yet there is no way to tell the compiler (and this assert is generated by 
the compiler) to not generate the assert for given method.

i see that assert as completely unnecessary:
1. it does nothing to protect me from calling virtual method with null 
object.
2. it forces me to write unnecessary null checks everywhere in my code 
instead of delegating that to class methods.


we can add another attribute that turns off such checks, but i'm 
proposing to remove that check altogether, cause:
1. there are too many attributes already.
2. let non-virtual methods segfaults as virtual ones already does, thus 
making 'em consistent.


please, kill that counter-productive limiting "feature" for good!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20150411/303eab37/attachment.sig>


More information about the Digitalmars-d mailing list