Próbuję użyć metod rozszerzających, aby dodać przeciążenie operatora do StringBuilder
klasy C # . Konkretnie biorąc StringBuilder
sb
, chciałbym sb += "text"
stać się odpowiednikiem sb.Append("text")
.
Oto składnia tworzenia metody rozszerzenia dla StringBuilder
:
public static class sbExtensions
{
public static StringBuilder blah(this StringBuilder sb)
{
return sb;
}
}
Pomyślnie dodaje blah
metodę rozszerzenia do StringBuilder
.
Niestety, wydaje się, że przeciążenie operatora nie działa:
public static class sbExtensions
{
public static StringBuilder operator +(this StringBuilder sb, string s)
{
return sb.Append(s);
}
}
Między innymi słowo kluczowe this
nie jest dozwolone w tym kontekście.
Czy jest możliwe dodawanie przeciążeń operatorów za pomocą metod rozszerzających? Jeśli tak, jaki jest właściwy sposób, aby to zrobić?
c#
extension-methods
operator-overloading
Jude Allred
źródło
źródło
Odpowiedzi:
Obecnie nie jest to możliwe, ponieważ metody rozszerzające muszą znajdować się w klasach statycznych, a klasy statyczne nie mogą mieć przeciążeń operatorów.
Mads Torgersen, premier języka C # mówi:
Edytować:
Właśnie zauważyłem, Mads napisał więcej w tym samym artykule :
Ta funkcja jest obecnie w tabeli (potencjalnie) dla języka C # 8.0. Mads mówi nieco więcej o wdrażaniu go tutaj .
źródło
String
na PowerShellScriptBlock
.true.Xor(false)
potem^
jest operatorem xor w C #Jeśli kontrolujesz miejsca, w których chcesz używać tego „operatora rozszerzenia” (co i tak zwykle robisz z metodami rozszerzającymi), możesz zrobić coś takiego:
StringBuilderWrapper
Klasy deklaruje ukryte operatora konwersji od AStringBuilder
i deklaruje żądany+
operatora. W ten sposóbStringBuilder
można przekazać aReceiveImportantMessage
, które zostanie po cichu przekonwertowane na aStringBuilderWrapper
, gdzie+
można użyć operatora.Aby uczynić ten fakt bardziej przejrzystym dla wywołujących, możesz zadeklarować
ReceiveImportantMessage
jako przyjmowanie aStringBuilder
i po prostu użyć takiego kodu:Lub, aby użyć go w tekście tam, gdzie już używasz
StringBuilder
, możesz po prostu zrobić to:Stworzyłem post o podobnym podejściu, aby uczynić go
IComparable
bardziej zrozumiałym.źródło
StringBuilderWrapper
który to umożliwia.StringBuilder
typ i zapewni z niego niejawny operator konwersji. Następnie można go używać z literałami łańcuchowymi, jak pokazano na przykładzie:sb += "Hello World!";
String
:PushIndent(" ".X(4))
(można by też wywołaćTimes
). A może za pomocą tego konstruktora:PushIndent(new String(' ', 4))
.Wygląda na to, że obecnie nie jest to możliwe - istnieje otwarty problem z opinią, który wymaga tej funkcji w Microsoft Connect:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=168224
sugeruje, że może pojawić się w przyszłej wersji, ale nie jest zaimplementowana w bieżącej wersji.
źródło
Chociaż nie jest możliwe wykonanie operatorów, zawsze możesz po prostu utworzyć metody Add (lub Concat), Subtract i Compare ....
źródło
Ha! Szukałem "przeciążenia operatora rozszerzenia" z dokładnie tym samym pragnieniem, dla sb + = (rzecz).
Po przeczytaniu odpowiedzi tutaj (i stwierdzeniu, że odpowiedź brzmi „nie”), dla moich szczególnych potrzeb wybrałem metodę rozszerzającą, która łączy w sobie sb.AppendLine i sb.AppendFormat i wygląda lepiej niż obie.
A więc,
Nie jest to ogólna odpowiedź, ale może zainteresować przyszłych poszukujących tego rodzaju rzeczy.
źródło
AppendLine
zamiastLine
.Można go uzbroić w owijkę i przedłużki, ale nie da się tego zrobić prawidłowo. Kończysz ze śmieciami, które całkowicie mijają cel. Mam gdzieś tutaj post, który to robi, ale jest bezwartościowy.
Btw Wszystkie konwersje numeryczne tworzą śmieci w konstruktorze ciągów, które należy naprawić. Musiałem napisać opakowanie do tego, co działa i używam go. Warto to przeczytać.
źródło