2012-01-03 6 views
2

私はPreamble: what is a reference type?に従っています。最初の例では、次のコードがあります。Console.WriteLine()は、オブジェクトを文字列に変換する方法をどのように知っていますか

using System; 
using System.Text; 

public class Example1 
{ 
    public static void Main (string[] args) 
    { 
     StringBuilder first = new StringBuilder(); 
     StringBuilder second = first; 
     first.Append ("hello"); 
     first = null; 
     Console.WriteLine (second); 
    } 
} 

そして、それは、クラス(または構造体)のソースコードを提供しないのStringBuilderのを、私はConsole.WriteLineを(秒)を返すことができるのか分かりません識別子を使用するだけで文字列値を返します。コンストラクタで値を返すことは可能ですか?

私は、次の(と、それは動作しません)によってクラスまたは構造体を書き込もうとしました:

struct StringBuilder 
{ 
    private string _myString; 
    public string StringBuilder 
    { 
     get { return _myString; } 
     set { _myString = value; } 
    } 
    public void Append(string str) 
    { 
     _myString = str; 
    } 
} 
+0

のStringBuilderがSystem.Textの名前空間で定義されています

class Example { public string Value { get; set; } public Example(string value) { Value = value; } public override string ToString() { return Value; } } 

今、あなたのオブジェクトの文字列値は、その値になります。なぜ私はそれを再定義しようとしているのか分かりません。プログラムでSystem.Text名前空間を使用するため、おそらく名前の衝突が発生します。何があなたのためにはうまくいかないのですか? –

+0

@EricJ。私は.NETとC#の新機能で、StringBuilderが.NETクラスであることを知らなかった。この例を読んで、私はクラスを書くことを試みました。とにかく、私はまだStringBuilderのオブジェクトをToString()メソッドを呼び出さずに印刷できるかどうか不思議です。 – KMC

答えて

3

は、ルックConsole.WriteLine(object value)ためdocumentationを持っています。

値のToString方法は、その文字列 表現を生成するために呼び出され、結果の文字列が標準 出力ストリームに書き込まれます。それは、この言います。

独自のクラスまたは構造体の文字列表現を印刷する場合は、ToString()メソッドをオーバーライドする必要があります。

4

StringBuilderSystem.Text名前空間で.NETクラスです。

+6

正解ですが、質問に答えません。 – M4N

2

StringBuilderclassであり、structではありません。この点でC#はC++に似ていません.2つは実際には異なります。そしてConsole.WriteLine(x)ここで、xは任意のクラスで、Console.WriteLine(x.ToString())となります。

+0

StringBuilderが.NETクラスであることがわかりませんでした。とにかく、オブジェクト自体を呼び出すことで、メソッド "ToString()"を呼び出さずに文字列を印刷する方法がまだ不思議です – KMC

+1

@KMC:彼はあなたに言っただけです。 'Console.WriteLine'関数を呼び出し、クラスの任意のインスタンスを渡すと、[overload](http://msdn.microsoft.com/en-us/library/swx4tc5e.aspx)は' ToString'を呼び出しますオブジェクトのテキスト表現を得るために関数を使用します。 –

3

オブジェクト文字列表現のための方法ToStringをオーバーライドします。

public override string ToString() 
{ 
    return _myString; 
} 

またはあなたの財産をプリントアウト:

Console.WriteLine (second.StringBuilder); 
+0

はい、これはOPの質問に対する真の答えです。 C#のすべてのオブジェクト(したがって、すべての種類の変数はすべてObjectから継承されるため)は、ToString関数を組み込んでいます。このように、暗黙のうちに呼び出されます。オブジェクトとそのメンバについては、こちらを参照してください。http://msdn.microsoft.com/en-us/library/system.object_members%28VS.80%29.aspx –

2

コードの目的は、StringBuilderインスタンスのToStringを呼び出すことです。

Console.WriteLine(second.ToString()); 

あなたがあなた自身のクラスでToStringメソッドをオーバーライドすることができます:あなたが明示的にそれは暗黙的に呼び出されることさせるのではなく、ToStringを呼び出す場合コードが明確になります。クラスを使用する必要がある場合は、構造体を使用するようにしてください。構造体は正しく実装するのがより複雑です。

例:

Example ex = new Example("test"); 
Console.WriteLine(ex); 
関連する問題