7 Stimmen

C#: Force Compiler-Fehler bei Verwendung von myObj.ToString()

Ich habe eine Klasse, die eine Reihe von Eigenschaften enthält. Es ist ein Fehler eines Programmierers, wenn er ToString() für ein Objekt dieses Typs aufruft. Nehmen Sie diesen Beispielcode:

using System;

public class Foo
{
    public int ID = 123;
    public string Name = "SomeName";

    private string ToString() { return null; }
}

public class MyClass
{
    public static void Main()
    {
        Foo myObj = new Foo();
        WL("I want this to be a compiler error: {0}", myObj.ToString());
        RL();
    }

    #region Helper methods

    private static void WL(object text, params object[] args)
    {
        Console.WriteLine(text.ToString(), args);   
    }

    private static void RL()
    {
        Console.ReadLine(); 
    }

    #endregion
}

Man könnte argumentieren, dass, wenn ID ist, was die meisten Menschen wollen als eine Zeichenfolge geschrieben, dann sollte ich implementieren ToString so, dass es die ID zurückgibt. Ich halte dies jedoch für eine schlechte Praxis, da Programmierer "versehentlich" funktionierenden Code erhalten. Ein Programmierer, der meine Klasse verwendet, sollte angeben, was er will.

Stattdessen möchte ich, dass, wenn jemand myObj.ToString() aufruft, dies als Kompilierzeitfehler angezeigt wird. Ich dachte, ich könnte das tun, indem ich eine private ToString()-Funktion erstelle, aber das funktioniert nicht.

Der Grund, warum ich das angesprochen habe, ist, dass wir am Ende eine Abfragezeichenfolge hatten, die den voll qualifizierten Klassennamen und nicht eine ID enthielt.

Die Frage ist also: Gibt es eine Möglichkeit, die Funktion ToString() zu "verstecken", so dass der Aufruf auf ein Objekt meiner Klasse einen Compilerfehler verursacht?

1voto

PhilGriffin Punkte 638

Überschreiben Sie ToString, um string.Empty zurückzugeben, dann wird nichts an die Abfragezeichenfolge angehängt. Wenn Sie ToString nicht überschreiben, erhalten Sie standardmäßig die Version von Object, die this.GetType() zurückgibt und Ihnen so etwas wie den Namespace und den Klassennamen liefert.

Aufrufen von ToString scheint eine ziemlich vernünftige Sache zu tun, würde ich nicht wollen, um Complier-Fehler für jemanden tun, dass zu erhöhen.

0voto

Bitte beachten Sie, dass Ihr Entwurf/Ihre Meinung geändert werden muss :)

Zunächst einmal definiert die Definition von Foo.ToString() keine Überschreibung von Object.ToString(), sondern eine neue und sollte mit dem Schlüsselwort "new" eingeleitet werden, um Missverständnisse über die Semantik zu vermeiden. Oder explizit einen "Override" deklarieren. IMHO gibt der Compiler eine entsprechende Warnung aus.

Selbst wenn Sie einen Weg finden, den Aufruf von Foo.ToString zu verbieten, wird er zur Kompilierzeit nur dann verboten, wenn der Typ von "this" als Foo oder Nachkomme bekannt ist, aber ((object) foo).ToString() wird ein richtig umgangen werden, da ToString eine Methode der Schnittstelle Object ist.

Außerdem ist es unerwünscht, einen Aufruf von ToString zu verhindern, da Debugger diesen verwendet, um einen Wert zu präsentieren. SY, Jake

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X