System.IO.StreamWriter
を使用してファイルに書き込むための2つの静的オーバーロードされたメソッドを作成しました。最初のメソッドは1行を書くべきです。そして、2番目の方法は、多くの行を書く必要があります。文字列だけでなく、int
、float
、bool
、ToString()
のオブジェクトなどの他のプリミティブ型でも使用できるように汎用的にしようとしました。ストリング[]をIEnumerable <T>に、ストリングをTにC#オーバーロードされたメソッド
public static void WriteLine<T>(string path, T t, bool append = false)
{
using (var file = new StreamWriter(path, append))
{
file.WriteLine(t.ToString());
}
}
public static void WriteLine<T>(string path, IEnumerable<T> ts, bool append = false)
{
using (var file = new StreamWriter(path, append))
{
foreach (var t in ts)
{
file.WriteLine(t.ToString());
}
}
}
ただし、私の方法は問題があるようです。
string pathString = @"C:\temp";
const string fileName = @"test.txt";
string path = Path.Combine(pathString, fileName);
const bool append = true;
string line = "single";
WriteLine(path, line, append);
string[] lines = { "first", "second", "third" };
WriteLine(path, lines, append);
私の2つの方法の最初にWriteLine
解決するために、両方のコール:たとえば、私は次のコードがあるとします。 WriteLine
への最初の呼び出しは、文字列を渡しているのでWriteLine
への2番目の呼び出しは2番目のメソッドに解決されるので、1番目のメソッドに解決することを期待していました。しかし、そうではありません。また
、私はpublic static void WriteLine<T>(string path, IEnumerable<T> ts, bool append = false)
にWriteLine
解決するには、両方の呼び出し、最初の方法public static void WriteLine<T>(string path, T t, bool append = false)
を削除し、私は次の出力を得る場合:私は、WriteLine
解決するには、両方のコールを第二の方法public static void WriteLine<T>(string path, IEnumerable<T> ts, bool append = false)
を削除する場合は、さらに
s
i
n
g
l
e
first
second
third
を
single
System.String[]
がどのように私は私の静的を過負荷に修正することができます:public static void WriteLine<T>(string path, T t, bool append = false)
に、私は次の出力を得ますパラメータとしてstring[]
をパラメータとして渡してを呼び出し、string
をパラメータとして渡して、WriteLine
メソッドをT
と呼びます。
この時点で、可能かどうかはわかりません。そうでない場合は、メソッドの名前をWriteLine(T t)
とWriteLines(IEnumerable<T> ts)
'string'は' IEnumerable 'を実装しています。この特別な場合、 'WriteLine(string s)'のオーバーロードが必要な場合や、 'WriteLine (line)'として手動でコールを修飾することができます。 –
yaakov
最も読みやすいアプローチは、過負荷をまったく持たないことです。これは、 'WriteLine (IEnumerable)'は1行を書きませんので、何行も書き込むので、代わりに 'WriteLines (IEnumerable )'と呼ぶべきです。 –
dasblinkenlight
@codran - 'WriteLine(string s)'のオーバーロードが欲しくない理由は、明示的に文字列としてキャストしなくても、 'int'や' float'のような他の基本データ型を渡すことができるからです。たとえば、 'WriteLine(123)'や 'WriteLine(1.23)'などです。 – kimbaudi