我正在关注Preamble: what is a reference type?,它解释了作为值或引用类型传递的参数。第一个示例包含以下代码:
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 :(得分:4)
StringBuilder
是System.Text
命名空间中的.net类。
答案 1 :(得分:3)
覆盖对象字符串表示的ToString
方法。
public override string ToString()
{
return _myString;
}
或打印出您的财产:
Console.WriteLine (second.StringBuilder);
答案 2 :(得分:3)
查看Console.WriteLine(object value)
的{{3}}。它说:
调用
ToString
value方法来生成其字符串 表示,并将结果字符串写入标准 输出流。
所以(正如其他人写的那样),如果你想打印自己的类或结构的字符串表示,你应该覆盖documentation方法。
答案 3 :(得分:2)
StringBuilder
是class
,而不是struct
。在这方面,C#与C ++不同:这两者实际上是不同的。其中x是任意类的Console.WriteLine(x)
最终为Console.WriteLine(x.ToString())
。
答案 4 :(得分:2)
代码的作用是在ToString
实例上调用StringBuilder
。如果您明确调用ToString
而不是让它被隐式调用,则代码会更清晰:
Console.WriteLine(second.ToString());
您可以覆盖自己班级中的ToString
方法。顺便说一下,如果你有特殊的需要,你应该只使用结构。结构更难以正确实现。
示例:
class Example {
public string Value { get; set; }
public Example(string value) {
Value = value;
}
public override string ToString() {
return Value;
}
}
现在,对象的字符串值将是其值:
Example ex = new Example("test");
Console.WriteLine(ex);