Multi-parameter FreeAndNil plus InitialiseNil methods – interesting code ceremony reduction by David Heffernan
Posted by jpluimers on 2020/03/05
I’m probably getting a truckload of anti-FreeAndNil folks over me, but there are cases this comes in useful, so having an overloaded version cutting down code ceremony makes sense: [WayBack] interface – Avoiding nested try…finally blocks in Delphi – Stack Overflow
Which means I need to update my type safe FreeAndNil one day.
This should be relatively straightforward, given that David published a python generator for his Delphi code [WayBack].
–jeroen
Via: [WayBack] Interesting approach by David Heffernan (*1) to the nested try..finally blocks because of multiple object creations: Overloaded InitializeNil and FreeA… – Thomas Mueller (dummzeuch) – Google+
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| unit ObjectHelperUnit; | |
| interface | |
| type | |
| TObjectHelper = record | |
| class function Cast<T: class>(const aValue: TObject): T; static; | |
| class procedure FreeAndNil<T: class>(var Value: T); static; | |
| end; | |
| implementation | |
| uses | |
| System.SysConst, | |
| System.SysUtils; | |
| class function TObjectHelper.Cast<T>(const aValue: TObject): T; | |
| var | |
| lException: Exception; | |
| begin | |
| if Assigned(aValue) then | |
| begin | |
| if aValue is T then | |
| Result := T(aValue) | |
| else | |
| begin | |
| lException := EInvalidCast.CreateFmt('%s; actual type %s but expected %s.', | |
| [SInvalidCast, aValue.QualifiedClassName, T.QualifiedClassName]); | |
| raise lException; | |
| end; | |
| end | |
| else | |
| Result := nil; | |
| end; | |
| class procedure TObjectHelper.FreeAndNil<T>(var Value: T); | |
| begin | |
| System.SysUtils.FreeAndNil(Value); | |
| end; | |
| end. |






Leave a comment