この「拡張演算子」を使用する場所を制御する場合(通常、拡張メソッドを使用して行います)、次のようなことができます。
class Program {
static void Main(string[] args) {
StringBuilder sb = new StringBuilder();
ReceiveImportantMessage(sb);
Console.WriteLine(sb.ToString());
}
// the important thing is to use StringBuilderWrapper!
private static void ReceiveImportantMessage(StringBuilderWrapper sb) {
sb += "Hello World!";
}
}
public class StringBuilderWrapper {
public StringBuilderWrapper(StringBuilder sb) { StringBuilder = sb; }
public StringBuilder StringBuilder { get; private set; }
public static implicit operator StringBuilderWrapper(StringBuilder sb) {
return new StringBuilderWrapper(sb);
}
public static StringBuilderWrapper operator +(StringBuilderWrapper sbw, string s) {
sbw.StringBuilder.Append(s);
return sbw;
}
}
StringBuilderWrapper
クラスが宣言暗黙変換演算子から、StringBuilder
及び所望の宣言+
演算子。このようにして、a StringBuilder
をに渡すことができますReceiveImportantMessage
。これは暗黙的にに変換されStringBuilderWrapper
、そこで+
演算子を使用できます。
この事実を呼び出し元に対してより透過的にするにはReceiveImportantMessage
、をとることを宣言し、次のStringBuilder
ようなコードを使用します。
private static void ReceiveImportantMessage(StringBuilder sb) {
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
}
または、すでにを使用している場合にインラインで使用するにはStringBuilder
、次のように実行します。
StringBuilder sb = new StringBuilder();
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
Console.WriteLine(sb.ToString());
私は同様のアプローチを使用してより理解しやすくすることについて投稿を作成しましたIComparable
。