首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的对象行为

C#中的对象行为
EN

Stack Overflow用户
提问于 2022-03-01 02:20:04
回答 3查看 87关注 0票数 1

我创建了两个对象,strprog。当我打印这两个对象时

对象1的输出:(打印字符串)

代码语言:javascript
复制
Web World!!

对象2的输出:(打印类的名称)

代码语言:javascript
复制
Program1

有人能解释一下为什么会发生这种事吗?

代码语言:javascript
复制
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);
    }
}
EN

回答 3

Stack Overflow用户

发布于 2022-03-01 02:31:51

这是因为系统不知道它应该如何打印Program1类型的对象,告诉系统如何打印该类型的方法是重写Program1类中的ToString方法。您可以通过简单地添加:

代码语言:javascript
复制
public override string ToString() 
{
  return str1;
}

进入Program1类。所有C#对象自然都有此方法,但它将只返回类名(或其他值im不能100%确定),默认情况下,我们重写此方法以告知系统如何将Program1类型的对象格式化为字符串,从而允许正确地打印它。

票数 4
EN

Stack Overflow用户

发布于 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的类的示例(来自第一篇文章)

代码语言:javascript
复制
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成为属性而不是字段

代码语言:javascript
复制
public record Program1
{
    public string Str1 { get; set; }
    public Program1(string str1)
    {
        Str1 = str1;
    }
} 

然后

代码语言:javascript
复制
Program1 prog = new Program1("Hello");
Console.WriteLine(prog);

版画

代码语言:javascript
复制
Program1 { Str1 = Hello }
票数 1
EN

Stack Overflow用户

发布于 2022-03-01 07:33:09

当您调用Console.WriteLine( someArg );而someArg不是字符串时,将自动调用ToString()方法。

@tymtam指出

Object.ToString方法的默认实现返回对象类型的完全限定名。

您的Program1类继承对象,不覆盖ToString(),因此您将获得完全限定的名称。

StringBuilder重写将其值转换为字符串的ToString方法,您将得到“World!!”字符串

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71303047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档