Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C#] Constructor chaining (https://www.delphipraxis.net/118814-%5Bc-%5D-constructor-chaining.html)

phXql 15. Aug 2008 11:24


[C#] Constructor chaining
 
Hallo ihrse,

folgendes Problem: Ich habe eine Klasse mit zwei Konstruktoren.

Code:
public GlobalHotkey(Control control)
und

Code:
public GlobalHotkey(IntPtr handle)
Nun will ich, dass der Konstruktor mit dem Control-Argument den Konstruktor mit dem IntPtr-Argument aufruft. Das hab ich so hingekriegt:

Code:
public GlobalHotkey(Control control): this(control.Handle) {}
Nun möchte ich aber eine ArgumentNullException werfen, wenn das Control-Argument null ist. Aber ich bekomms einfach nich hin, bin ich zu doof oder geht das wirklich nich?

OregonGhost 15. Aug 2008 12:16

Re: [C#] Constructor chaining
 
Auf Anhieb wüsste ich nur eine etwas unsaubere Lösung mithilfe einer Utilty-Funktion, z.B.
Code:
IntPtr HandleFromControl(Control control)
{
    if (control != null) {
        return control.Handle;
    }
    throw new ArgumentNullException("control");
}
und dann im Konstruktoraufruf eben
Code:
public GlobalHotkey(Control control): this(HandleFromControl(control)) {}

Elvis 15. Aug 2008 12:58

Re: [C#] Constructor chaining
 
Zitat:

Zitat von OregonGhost
Auf Anhieb wüsste ich nur eine etwas unsaubere Lösung mithilfe einer Utilty-Funktion

Die sollte dann aber statisch sein.

Ist übrigens nicht unsauber. Die CLR erlaubt es fast nix vor dem ctor des Vorgängers aufzurufen.
Kein callvirt, kein SEH, ...
Da C# ständig callvirt nutzt wäre eine Instanzmethde ein wenig heikel, deshalb statisch.

phXql 15. Aug 2008 19:44

Re: [C#] Constructor chaining
 
Hm, okay. Nicht sehr schön, aber wenn's sein muss... Danke euch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz