この「拡張演算子」を使用する場所を制御する場合 (通常は拡張メソッドで行います)、次のようなことができます。
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
クラスは、 a からの暗黙の変換演算子StringBuilder
を宣言し、目的の+
演算子を宣言します。このようにして、 aStringBuilder
を に渡すことができます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