2010-02-20 11 views
13

Mögliche Duplizieren:
Is it possible to create a new operator in c#?Definieren Sie neue Operatoren in C#?

Ich liebe C#, aber eine Sache, die ich wünschte, es hatte, war die Fähigkeit, meine eigenen Operatoren auf Klassen zu definieren, wie A => B anstelle von A.Implies (B) zu machen. Ich denke, es wäre wirklich cool, wenn Sie einer Klassenmethode einen Bezeichner beliebiger Länge in einem Satz wie [+ - */&^|% $ # @> <] + zuweisen und dann wie einen Operator verwenden könnten. Weiß jemand, ob es eine Art Erweiterung gibt oder ob es überhaupt möglich ist, eine solche zu machen?

Antwort

10

Dies ist nicht in die Sprache integriert. Sie sind dabei, die vordefinierten Operatoren, die mit der Sprache geliefert werden, zu überladen (overloadable operators).

Wenn Sie diesen Debugging-Stil mögen, möchten Sie vielleicht F# in Betracht ziehen. Es ist eine funktionale Sprache, die auf dem .NET-Framework läuft und Ihnen die Möglichkeit gibt, jeden beliebigen Operator zu definieren.

+5

Nach vielen Jahren und Projekten in C++ muss ich eher widersprechen, wenn ich das Wort "traurig" benutze. –

+1

Das Wort leider entfernen. Ich hatte in letzter Zeit zu viel Spaß mit F # und Ruby mit ihrer Inline-DSL-Magie. – smaclell

0

Kurz gesagt, nein. Du müsstest dir eine andere Sprache anschauen. Sie können viele der bestehenden-Operatoren überladen oder andere Methoden (einschließlich Erweiterungsmethoden, die sehr praktisch sind) definieren - aber Sie können benutzerdefinierte Operatoren in keiner Variante von C#, die ich kenne, definieren.

+0

Und es gibt Einschränkungen, was Sie mit den vorhandenen Operatoren tun können - z.B. Wenn Sie '==' definieren, müssen Sie '! =', usw. definieren und die Argumente/Rückgabetypen sind nicht immer vollständig geöffnet. –

0

Nein, das ist nicht möglich, es sei denn, Sie machen Ihren eigenen C# ähnlichen Compiler.

Sie können nur einige der integrierten Operatoren überschreiben, Sie können keine neuen Operatoren erstellen und der Lambda-Operator (=>) kann nicht überschrieben werden.

3

Die Liste der Operatoren, die überlastet werden können, ist here.

Nur Überladung des Operators ermöglicht es Ihnen, das Verhalten von Operatoren zu ändern und keine neuen zu definieren.

Und obwohl A => B als A.Implies(B) klingt cool, wird es später Probleme verursachen (in 6 Monaten, wenn Sie versuchen herauszufinden, was Ihr Code tun soll).

+8

Mit diesem Argument sollten wir 'a.Plus (b)' verwenden, falls wir vergessen, was '+' in Arithmetik oder String-Verkettung bedeutet. Wenn Sie sich für eine Bedeutung eines Symbols in einer Domäne entscheiden und diese dann häufig verwenden, ist es * extrem * einfach, sich daran zu erinnern, was es bedeutet. Wenn Sie es nicht oft benutzen, ist es nicht wert, das Symbol zu erfinden. In der Praxis ist das also kein Problem. –

+3

@Earwicker: Ich kaufe es nicht. '+' wird allgemein verstanden. Während '=>' Ihnen in der Welt den ganzen Sinn geben kann, wenn jemand anders Ihren Code pflegen muss, werden Sie es vielleicht nicht so einfach finden, sich daran zu erinnern oder sich daran zu erinnern, was vor sich geht. –

+3

@David Brown: '+' bedeutet Stringverkettung in C#. Es ist nicht in VB.NET. Es wird also nicht in allen seinen Bedeutungen allgemein verstanden. Sie gehen davon aus, dass es besser ist, Code zu schreiben, damit eine schlecht informierte Person ihn langsam lesen kann - denken Sie daran, dass es besser ist, es zu schreiben, damit eine informierte Person es schnell lesen kann. Direkt nachdem C# 3 herauskam, wussten die meisten C# -Programmierer nicht, was '=>' in einem Lambda bedeutete.War das C# -Team falsch, dieses Symbol zu verwenden? Nein, sie erwarteten, dass die Gemeinschaft die neue Bedeutung aufnehmen würde. Ebenso dient eine Bibliothek, die eigene Symbole erfindet, einer Gemeinschaft, und Sie können ihr beitreten oder nicht. –