19 Stimmen

C# Potenzielle Interviewfrage ... zu schwer?

Ohne diesen Code auszuführen, identifizieren Sie bitte, welche Foo-Methode aufgerufen wird:

class A
{
   public void Foo( int n )
   {
      Console.WriteLine( "A::Foo" );
   }
}

class B : A
{
   /* beachten Sie, dass A::Foo und B::Foo überhaupt nicht zusammenhängen */
   public void Foo( double n )
   {
      Console.WriteLine( "B::Foo" );
   }
}

static void Main( string[] args )
{
   B b = new B();
   /* welches Foo wird gewählt? */
   b.Foo( 5 );
}

Welche Methode? Und warum? Kein Mogeln, indem Sie den Code ausführen.

Ich habe dieses Rätsel im Internet gefunden; ich mag es und denke daran, es als Interviewfrage zu verwenden... Meinungen?

EDIT: Ich würde einen Bewerber nicht dafür beurteilen, wenn er dies falsch beantwortet, sondern es als Möglichkeit nutzen, eine umfassendere Diskussion über C# und CLR selbst zu eröffnen, damit ich ein gutes Verständnis der Fähigkeiten des Bewerbers erlangen kann.

Quelle: http://netpl.blogspot.com/2008/06/c-puzzle-no8-beginner.html

35 Stimmen

Wenn mich jemand fragt, werde ich sagen, du hättest die Main-Methode in einer Klasse schreiben sollen :))

0 Stimmen

Kann mir jemand erklären, warum die Basisklassenmethode aufgerufen wird, wenn wir den Parameter vom Typ int auf double (A.Foo) und von double auf int (B.Foo) ändern und den Input als double übergeben?

57voto

Jon Skeet Punkte 1325502

Ich würde das wirklich nicht als Interviewfrage verwenden. Ich kenne die Antwort und die Begründung dahinter, aber so etwas sollte so selten vorkommen, dass es kein Problem sein sollte. Die Antwort zu kennen zeigt wirklich nicht viel über die Fähigkeit eines Kandidaten, zu coden.

Beachten Sie, dass Sie dasselbe Verhalten auch erhalten, wenn A.Foo virtual ist und B es überschreibt.

Wenn Sie C#-Rätsel und Kuriositäten mögen, habe ich auch ein paar (einschließlich dieses).

0 Stimmen

Ich habe bemerkt, dass es dort unten eine Antwort gibt, die das Problem von Bewerbern anspricht, die Fragen aus den falschen Gründen richtig beantworten. Ich schlug vor, dass Designfragen stärker fokussiert sein sollten als Trivia. Du kannst immer ein Kompilierungsproblem lesen oder einen Bug herausfinden, aber schlechtes Design dauert viel länger zu beheben. (Ich bringe das nur zur Sprache, weil es diese Antwort verbessert und im Schlamm verloren geht).

0 Stimmen

Dies ist der Grund, warum die implizite Umwandlung von nicht verwandten Typen nervt :)

0 Stimmen

Eine alte Frage, aber ich war verwirrt von einem Teil: Warum wird die Basisklassenmethode aufgerufen, wenn wir den Parametertyp von int auf double ändern (A.Foo) und von double auf int (B.Foo) und den Eingabe als double übergeben (B.Foo(5.8))?

26voto

plinth Punkte 46829

Zu schwierig? Nein, aber was ist Ihr Ziel bei der Frage? Was erwarten Sie von Ihrem Interviewpartner? Dass sie diese bestimmte syntaktische Eigenheit kennen? Das bedeutet entweder, dass sie die Spezifikation/Sprache gut studiert haben (gut für sie) oder dass sie auf dieses Problem gestoßen sind (hoffentlich nicht durch das, was sie geschrieben haben, aber wenn sie es getan haben - Yikes). Weder Fall deutet wirklich darauf hin, dass Sie einen soliden Programmierer/Ingenieur/Architekten vor sich haben. Ich glaube, dass die Diskussion rund um die Frage wichtiger ist als die Frage selbst.

Wenn ich Kandidaten interviewe, stelle ich in der Regel eine verblüffend einfache Frage, die auf einer sprachlichen Eigenheit basiert - aber es ist mir egal, ob mein Interviewpartner sie kennt, denn diese sprachliche Eigenheit ermöglicht es mir, viele Möglichkeiten zu eröffnen, um herauszufinden, ob mein Kandidat methodisch ist, welchen Kommunikationsstil sie haben, ob sie bereit sind zu sagen "Ich weiß es nicht", ob sie in der Lage sind, spontan zu denken, ob sie das Design von Sprachen und Maschinenarchitektur verstehen, ob sie Plattform- und Portabilitätsprobleme verstehen - kurz gesagt, ich suche nach vielen Zutaten, die alle zusammen "haben sie es verstanden?" ergeben. Dieser Prozess dauert eine Stunde oder länger.

Letztendlich ist es mir eigentlich egal, ob sie die Antwort auf meine Frage kennen - die Frage ist ein Trick, um all die anderen Informationen indirekt zu erhalten, ohne jemals danach fragen zu müssen. Wenn Sie keinen wertvollen Hintergedanken bei dieser Frage haben, sollten Sie sie nicht einmal stellen - Sie verschwenden Ihre Zeit und die Zeit Ihres Kandidaten.

3 Stimmen

Bester Interviewer, dem ich begegnet bin, hat mich für ein paar Stunden zu Fragen zu C# befragt, obwohl er wusste, dass ich kein C# kann (aber ich kenne java und C++). Ich habe ein Angebot bekommen basierend auf meiner Fähigkeit, die wahrscheinlichsten Antworten zu begründen.

12voto

Bill Punkte 1748

Kann Joel da nur zustimmen. Ich habe über 20 Jahre Erfahrung im Design und Codieren, und das Erste, woran ich dachte, als ich das sah, war: Es wird nicht einmal kompilieren.

Ich habe diese Annahme gemacht, weil ich versuche, Überlastungen zu vermeiden, die sich nur durch einen einzigen Datentyp unterscheiden, und beim Betrachten des Codes nicht einmal den Unterschied zwischen int/double bemerkte; ich ging davon aus, dass ein neuer Operator benötigt wird, um eine Neudefinition in B zu ermöglichen.

Tatsächlich hatte ich eine Bibliothek verwendet, die ein Mitprogrammierer zur Handhabung der Generierung einiger Textdateien erstellt hatte, die etwas verwirrend war, weil eine der Methoden 8 verschiedene Überladungen hatte und zwei davon sich nur durch den Datentyp des letzten Arguments unterschieden. Eine war string und die andere char. Die Wahrscheinlichkeit, dass der Wert, der für die String-Version des Parameters benötigt wurde, ein Zeichen lang war, war ziemlich hoch, also hoffentlich kannst du sehen, wohin das führt. Wir hatten riesige Probleme beim Debuggen, weil der Verwender der Bibliothek versehentlich den falschen Aufruf auslöste aufgrund von Unterschieden in Anführungszeichen, einfachen versus doppelten.

Moral der Geschichte, sei dankbar, dass der Kandidat die Antwort nicht kennt, denn dies könnte gute Codiergewohnheiten anzeigen.

1 Stimmen

Es scheint, als ob du nicht viel Vererbung in deinem Design verwendest. Das Überladen von Methoden mit demselben Namen, die sich durch einen Parameter-Typ unterscheiden, ist nicht ungewöhnlich.

0 Stimmen

Ich auch, genau wie du Bill, bevorzuge einen Programmierer, der sagen würde "Ich bin noch nie auf einen solchen Fall gestoßen" als einen, der die Antwort sofort wüsste.

0 Stimmen

Simucal, wir führen eine Menge Vererbung durch. Ich bin mir nicht sicher, warum die Methodenüberladung als ein Kennzeichen der Vererbung betrachtet werden würde. Vielleicht beziehst du dich eher auf Operatorenüberladungen und nicht auf Methodenüberladungen, von denen wir eine Menge durchführen und die im Code mit dem Operator-Schlüsselwort deutlicher erkennbar sind.

10voto

Joel Coehoorn Punkte 377088

Ein weiterer Stimmen gegen die Verwendung davon, aber aus einem anderen Grund.

Wenn man unter Druck wie diesem steht, würden viele wirklich gute Programmierer die falsche Antwort geben, aber nicht, weil sie die Konzepte nicht kennen oder es nicht herausfinden könnten. Was passiert ist, dass sie so etwas sehen und denken: "Aha, Trickfrage!", und dann weiter versuchen, sich in der Antwort zu übertreffen. Dies gilt insbesondere in einem Vorstellungsgespräch, wo sie nicht vom IDE oder Google oder einem anderen der anderen Hilfsmittel profitieren können, das ein Programmierer im alltäglichen Programmieren als selbstverständlich ansieht.

7voto

Keith Punkte 141163

Nicht wirklich fair als Interviewfrage, da es ein bisschen eine Trickfrage ist. Die gute Antwort, die ich von einem Bewerber hören möchte, wäre eher in die Richtung "Das muss refaktoriert werden".

Es sei denn, Sie suchen jemanden einstellen, um an Compilern zu arbeiten, bin ich mir nicht sicher, ob Sie so tief in die CLR gehen müssen.

Bei Interviewfragen suche ich nach Dingen, die das Verständnis des Coders in ihrer Antwort zeigen. Das ist eher eine Eigenheit/Rätsel.

0 Stimmen

Deine Antwort ist die beste. Wenn ich mit einer solchen Frage konfrontiert werde, würde ich versuchen, eine Antwort zu finden, aber letztendlich meine Meinung äußern, dass es eine schlechte Praxis ist, solche Rätsel im Code zu haben, und mich für eine andere Lösung entscheiden.

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