Planen Sie die Übernahme von .NET MAUI? Machen Sie sich bereit für ein Abenteuer mit NullReferenceException / Sudo Null IT News

.NET Multi-Plattform App UI ist ein Framework, das von Profis geschrieben wurde. Der Code für einige seiner Funktionen sieht jedoch so aus, als hätten die Entwickler die Konsequenzen der Dereferenzierung von Nullreferenzen vergessen.

Eine kleine Einführung

Ich maße mir nicht an, die Gesamtqualität des MAUI-Projekts zu beurteilen, aber ich habe den starken Verdacht, dass das Projekt mit Feedback-Korrekturen von Benutzern über Unerwartetes einen langen Weg zurücklegen muss NullReferenceException.

Der Code erweckt den Eindruck, dass die Autoren es eilig haben, ihn zu schreiben. Aus diesem Grund werden an vielen Stellen ungeprüft Verweise dereferenziert, die laut den Entwicklern selbst null sein können. Schauen wir uns zur Verdeutlichung einzelne Fragmente von an Quellen MAUI 6.0.424.

Warum so?

Diese Frage habe ich mir gestellt, als ich mir die unten präsentierten Fragmente angesehen habe. Entweder habe ich etwas nicht verstanden, oder die MAUI-Entwickler schreiben sehr merkwürdigen Code.

Sehen Sie sich zum Beispiel das Snippet der Funktion an Ereignisse anhängen Klasse AdaptiverTrigger:

void AttachEvents() { …. _visualElement = VisualState?.VisualStateGroup?.VisualElement; if (_visualElement ist nicht null) _visualElement.PropertyChanged += OnVisualElementPropertyChanged; _window = _visualElement.Window; // <= .... }

Hier kommt etwas Unsinn ins Spiel. Gemessen an den beiden “?” und das Überprüfen von “ist nicht null” im Feld _visualElement kann sein Null. Und buchstäblich genau dort sehen wir einen Anruf bei der Immobilie Fenster, aber ohne Überprüfung. Anscheinend übersehen.

Okay, machen wir weiter. Schauen Sie sich den Ausschnitt aus der Klasse an FormatierterString:

void OnCollectionChanged(….) { …. foreach (Objektelement in e.OldItems) { var bo = item as Span; bo.Parent = null; // <= if (bo != null) { .... } .... }

Wieder benachbarte Linien. Zuerst dereferenziert bound dann plötzlich beschließen, es zu testen Null. Ich weiß nicht, ob dieser Code in einigen Fällen abstürzt, aber es sieht alles seltsam aus.

Und hier ist ein Ausschnitt aus dem Unterricht Listenansicht:

protected override void SetupContent(Cell content, int index) { …. if (content != null) _logicalChildren.Add(content); content.Parent = this; VisualDiagnostics.OnChildAdded(this, content); }

Hier wieder etwas Unsinn. Warum wird ein Element mit einem Häkchen zur Sammlung hinzugefügt, aber wir greifen ohne es auf die Eigenschaft zu?

Ein weiterer “nützlicher” Check für Null Ich habe im Klassenkonstruktor gefunden ShellChromeGallery:

AppShell AppShell => Application.Current.MainPage als AppShell; public ShellChromeGallery() { …. if (AppShell != null) { flyoutBehavior.SelectedIndex = ….; flyoutHeaderBehavior.SelectedIndex = ….; } sonst { flyoutBehavior.SelectedIndex = 1; FlyoutHeaderBehavior.SelectedIndex = 0; } AppShell.FlyoutBackdrop = SolidColorBrush.Pink; // <= }

Naja, alles wieder cool: wir checken nach Nullsetzen Sie bei Bedarf einige Standardwerte und fallen Sie dann sofort ab.

Wenn man bedenkt, wie oft seltsame Fragmente auftauchen, fing ich sogar an, auf Gleichheit zu prüfen Null – überhaupt nicht, was es scheint. Nun, zum Beispiel wird im selben Unity-Operator “==” überladen und auf Gleichheit geprüft Null arbeitet dort in besonderer Weise. Allerdings habe ich so etwas in MAUI nicht gesehen.

Aber warum ist das so?

MAUI wird von Profis geschrieben, aber das Projekt ist sehr umfangreich und komplex. Menschen machen Fehler und das ist okay. Eine andere Sache ist seltsam: Solche Probleme können durchaus von verschiedenen automatisierten Tools abgefangen werden. Wie Sie vielleicht vermuten, habe ich die angezeigten Fragmente beispielsweise mit dem C#-Analysator von PVS-Studio gefunden. Meiner Meinung nach würden solche Tools das Leben von MAUI-Entwicklern erheblich vereinfachen. Im Allgemeinen wünsche ich ihnen viel Erfolg bei der Entwicklung des Projekts.

Wenn Sie diesen Artikel mit einem englischsprachigen Publikum teilen möchten, verwenden Sie bitte den Übersetzungslink: Nikita Lipilin. Planen Sie, .NET MAUI zu übernehmen? Machen Sie sich bereit für ein Abenteuer mit NullReferenceException.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *