Entwickler-Ecke

Basistechnologien - Methode auch mit 'Null' Objekt aufrufen?


alzaimar - Di 04.11.08 14:25
Titel: Methode auch mit 'Null' Objekt aufrufen?
Ahoj die Herren,

Ich möchte eine Methode aufrufen, wobei die Instanz auch null sein darf. Geht das?
Also, sowas hier:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public class MyClass
{
  public string Method()
  {
     if (this == null
       return "Ich bin Null";
     else
       return "Ich bin nicht Null";
  }
}

MyClass o = null;
Label1.Text = o.Method();


Hat einer einen Tipp?


JüTho - Di 04.11.08 14:56

Hallo,

die Methode muss auf jeden Fall static sein. Aber ob this mit null verglichen werden kann, habe ich dennoch Zweifel.

Jürgen


Christian S. - Di 04.11.08 15:17

Es geht auf jeden Fall mittels einer Extension Method:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    public class MyClass
    {

    }


    public static class MyClassExtension
    {
        public static string Method(this MyClass foo)
        {
            if (foo == null)
                return "Ich bin Null";
            else
                return "Ich bin nicht Null";
        }
    }


Aufruf genauso wie im ersten Posting:

C#-Quelltext
1:
2:
MyClass o = null;
Label1.Text = o.Method();


Kha - Di 04.11.08 15:59

Eigentlich hat die CLR kein Problem damit, das C#-Team hatte allerdings eins ;) . Deshalb ruft C#-Code auch nicht-virtuelle Methoden mit callvirt auf, womit es nicht erst bei einem Feldzugriff sondern schon beim Aufruf selbst knallt. AFAIK :gruebel: ist dem bei Oxygene nicht so. Ansonsten wie schon beschrieben durch die Extension-Hintertür.


Christian S. - Di 04.11.08 16:38

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
AFAIK :gruebel: ist dem bei Oxygene nicht so.
Stimmt, das hier gibt "Ich bin nil" aus:

Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  ConsoleApp = class
  public
    class method Main;
    method DoSomething;
  end;

implementation

class method ConsoleApp.Main;
begin
  var foo : ConsoleApp;
  foo.DoSomething;
  Console.ReadLine;
end;

method ConsoleApp.DoSomething;
begin
  Console.WriteLine(iif(self = nil,  'Ich bin nil''Ich bin nicht nil'));
end;