我创建了两个对象,str和prog。当我打印这两个对象时
对象1的输出:(打印字符串)
Web World!!对象2的输出:(打印类的名称)
Program1有人能解释一下为什么会发生这种事吗?
using System;
using System.Text;
public class Program1
{
string str1;
public Program1(string str2)
{
str1 = str2;
}
}
public class Program
{
public static void Main()
{
StringBuilder str = new StringBuilder("Web World!!", 30);
Console.WriteLine(str);
Program1 prog = new Program1("Hello");
Console.WriteLine(prog);
}
}发布于 2022-03-01 02:31:51
这是因为系统不知道它应该如何打印Program1类型的对象,告诉系统如何打印该类型的方法是重写Program1类中的ToString方法。您可以通过简单地添加:
public override string ToString()
{
return str1;
}进入Program1类。所有C#对象自然都有此方法,但它将只返回类名(或其他值im不能100%确定),默认情况下,我们重写此方法以告知系统如何将Program1类型的对象格式化为字符串,从而允许正确地打印它。
发布于 2022-03-01 04:15:56
Console.WriteLine(prog);打印Program1是因为
C#中的每个类或结构都隐式继承对象类。因此,C#中的每个对象都获得ToString方法,该方法返回该对象的字符串表示形式。(来自https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/how-to-override-the-tostring-method)
和
Object.ToString方法的默认实现返回对象类型的完全限定名。(参考https://learn.microsoft.com/en-us/dotnet/api/system.object.tostring)
下面是一个覆盖ToString的类的示例(来自第一篇文章)
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return "Person: " + Name + " " + Age;
}
}记录类型
可能值得一提的是记录类型。
来自记录(C#参考)
记录类型有一个编译器生成的ToString方法,该方法显示公共属性和字段的名称和值。ToString方法返回以下格式的字符串: {==.}
示例
如果Program1成为记录,而str1成为属性而不是字段
public record Program1
{
public string Str1 { get; set; }
public Program1(string str1)
{
Str1 = str1;
}
} 然后
Program1 prog = new Program1("Hello");
Console.WriteLine(prog);版画
Program1 { Str1 = Hello }发布于 2022-03-01 07:33:09
当您调用Console.WriteLine( someArg );而someArg不是字符串时,将自动调用ToString()方法。
@tymtam指出
Object.ToString方法的默认实现返回对象类型的完全限定名。
您的Program1类继承对象,不覆盖ToString(),因此您将获得完全限定的名称。
StringBuilder重写将其值转换为字符串的ToString方法,您将得到“World!!”字符串
https://stackoverflow.com/questions/71303047
复制相似问题