Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Sprachen (https://www.delphipraxis.net/82-net-sprachen/)
-   -   C# [Erledigt] Das mysteriöse null... (https://www.delphipraxis.net/155140-%5Berledigt%5D-das-mysterioese-null.html)

implementation 10. Okt 2010 20:13


[Erledigt] Das mysteriöse null...
 
Irgendetwas geht hier nicht mit rechten Dingen zu sich...
Code:
if (hovered != null) // Wird ausgeführt, also sollte hovered != null sein ...
{
        MessageBox.Show((hovered == null).ToString()); // Gibt "false" aus
        MessageBox.Show(hovered.Name); // Gibt eine NullReferenceException, weil hovered == null ist?????
        MessageBox.Show((hovered == null).ToString());
        // Hier übrigens die oben beschriebene Abfrage,
        // IsSensitive und AsSensitive sind Extension Methods
        if (hovered.IsSensitive())
                hovered.AsSensitive().MouseDown(e.X - hovered.Left, e.Y - hovered.Top);
}
Das soll mal einer verstehen ...
Ist hovered jetzt == null oder != null?
Nein, ich benutze keine Threads.
Und nein, ich gebe nirgendwo von Hand Objekte frei.

Siehe auch: http://www.c-sharp-forum.de/viewtopic.php?t=101986

stahli 10. Okt 2010 20:19

AW: Das mysteriöse null...
 
"!=" bedeutet m.E. "ungleich"
"==" bedeutet m.E. "gleich"
"=" bedeutet "zuweisen"

implementation 10. Okt 2010 20:20

AW: Das mysteriöse null...
 
Danke, weiß ich, ist auch nicht das Problem :wink:

stahli 10. Okt 2010 20:21

AW: Das mysteriöse null...
 
Ja, hab´s auch gerade erkannt...
(Du warst aber schneller :wink:)

Satty67 10. Okt 2010 20:37

AW: Das mysteriöse null...
 
hovered.Name == null?

hovered != null aber kein gültiger Zeiger?

Vermutlich letzteres, weil die ganze Testaktion sicher durch einen unerwarteten Fehler bei Zugriff auf IsSensitive aufgetreten ist. Ausser Name und IsSensitive wurden mit null initialisiert. Letzteres auch mal Testen. €: IsSensitive ist ja eine Methode...

Da das ja bei C# nicht vorkommen sollte, wie wurde hovered erzeugt, was ist hovered für eine Objekt-Klasse?

jfheins 10. Okt 2010 20:43

AW: Das mysteriöse null...
 
http://msdn.microsoft.com/de-de/library/edakx9da.aspx
Zitat:

// Equality operator also returns false when one
// operand is null.
:mrgreen:

Hmmm ... ich dachte ich hätte es, aber bei meinem Test macht der == Operator eigentlich sehr genau das, was er soll ....

Satty67 10. Okt 2010 21:11

AW: Das mysteriöse null...
 
ich nehme an, Name ist ein property in verkürzter Form
Code:
public string Name { get; set; }
dann sollte es automatisch initialisiert sein?

bei
Code:
private string name;
public string Name
{
  get { return name } usw.
ist name/Name null (wenn nicht im Constructor etc. initialisiert).

Ist halt nur ein Schuss ins Blaue, dass der Fehler nicht der vordergründig vermutete ist.

Luckie 10. Okt 2010 21:24

AW: Das mysteriöse null...
 
Gibt es bei C# keine Funktion wie in Delphi Assigned?

Satty67 10. Okt 2010 21:48

AW: Das mysteriöse null...
 
jain, in C# gibt es ja keine klassischen Funktionen wie in Delphi.

Es gibt für einzelne Objekte aber Methoden, wie z.B. string.IsNullOrEmpty.

Ausserdem sollte in C# ja ein Objekt-Zeiger immer gültig oder null sein, also nie null und ungültig.

Luckie 10. Okt 2010 22:05

AW: Das mysteriöse null...
 
Und kennt die Klasse eine entsprechende Methode?

Satty67 10. Okt 2010 22:19

AW: Das mysteriöse null...
 
Ich kenne die Klasse nicht, aber eher nein, ist keine Basis-Funtionalität. Da prüfen auf null immer funktionieren sollte, wäre das unnötig. Bei Strings macht es Sinn, da man zwei häufige Abfragen kombinieren kann.

Aphton 10. Okt 2010 22:32

AW: Das mysteriöse null...
 
Kann es sein, dass hovered.Name gleich NULL ist?

macht doch einfach mal ein:
Code:
  if (hovered.Name != NULL)
  {
        MessageBox.Show(hovered.Name);
  };

implementation 10. Okt 2010 22:47

AW: Das mysteriöse null...
 
Lest doch mal den verlinkten Thread im C#-Forum.
Da habe ich bereits genau beschrieben, was Name für eine Property ist.
Die Property Name ist vom Typ string und bietet Lese- und Schreibzugriff auf ein Feld.
Name zeigt an der Stelle auf den String "field" und ist daher auf jeden Fall ungleich Null.

hovered ist ganz normal über den Konstruktor erzeugt.

[edit]
Was noch von Belang sein könnte:
Zitat:

Zitat von Implementation im C#F
Code:
if (hovered != null)
{
        //MessageBox.Show((hovered == null).ToString());
        MessageBox.Show(hovered.Name); // Gibt "field" aus
        MessageBox.Show((hovered == null).ToString()); // Gibt "true" aus
        if (hovered.IsSensitive())
              hovered.AsSensitive().MouseDown(e.X - hovered.Left, e.Y - hovered.Top);
}

Hier tritt keine Exception auf.
Aber nach dem Zugriff auf Name ist hovered null. :gruebel:

[edit2]
Mal zur Aufklärung über hovered's Member:
- string Name: Property mit Getter und Setter
- bool IsSensitive(): Extension Method, fragt ab, ob das Objekt ein bestimmtes Interface ((I)QuinSensitiveControl) implementiert.
- AsSensitive(): Extension Method, liefert Objekt als obiges Interface zurück.
hovered ist ein nichtstatisches Feld und hat einen Interfacetyp ((I)QuinDynamicControl).
(I)QuinSensitiveControl ist von (I)QuinDynamicControl abgeleitet.
Weil IsSensitive() und AsSensitive() Extension Methods sind, gibt es keinen Fehler, wenn hovered null ist.
IsSensitive() liefert dann false zurück und AsSensitiv() null.

Luckie 10. Okt 2010 23:04

AW: Das mysteriöse null...
 
Ich glaube, die wenigsten haben Lust sich ihre Informationen aus zich Foren zusammenzusuchen, um dir helfen zu können.

implementation 10. Okt 2010 23:27

AW: Das mysteriöse null...
 
Deshalb habe ich's hier ja jetzt auch noch einmal geschrieben.

Luckie 10. Okt 2010 23:45

AW: Das mysteriöse null...
 
Zitat:

Zitat von Satty67 (Beitrag 1054975)
Ich kenne die Klasse nicht, aber eher nein, ist keine Basis-Funtionalität.

Dumm von mir. Die Methode kann es gar nicht geben. Denn wenn das Objekt nicht existiert, also null ist, kann die Methode ja auch nicht aufgerufen werden. Solch eine Methode würde also immer wahr liefern. ;)

implementation 11. Okt 2010 16:24

AW: [Erledigt] Das mysteriöse null...
 
Problem gelöst!
Die MessageBoxen haben zu einem MouseLeave geführt, der wiederum auslöste, dass hovered auf null gesetzt wurde :wall:
Danke, dass ihr euch mit meinem Problem auseinandergesetzt habt! :cheers:

Sir Rufo 11. Okt 2010 16:27

AW: [Erledigt] Das mysteriöse null...
 
Ich hatte da auch so eine Vermutung, aber c ist nicht meine Baustelle.

Aber immer wieder schön, wenn das Bauchgefühl stimmt

Meflin 11. Okt 2010 22:03

AW: [Erledigt] Das mysteriöse null...
 
Zitat:

Zitat von implementation (Beitrag 1055105)
Die MessageBoxen haben zu einem MouseLeave geführt, der wiederum auslöste, dass hovered auf null gesetzt wurde :wall:

Und ich wollte ja schon schreiben: MessageBox.Show ist kein Debugging, aber was verkneift man sich nicht alles so :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr.

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