Techiee
Techiee

Reputation: 19

Object behavior in C#

I have created two objects, str and prog. When I print both the objects

Output for Object 1: (The string is printed)

Web World!!

Output for Object 2: (The name of the Class is printed)

Program1

Can someone please explain why is this happening?

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);
    }
}

Upvotes: 1

Views: 158

Answers (3)

Kliment Nechaev
Kliment Nechaev

Reputation: 551

When you are calling Console.WriteLine(someArg); and someArg is not string, ToString() method will be called automatically.

As @tymtam pointed

Default implementations of the Object.ToString method return the fully qualified name of the object's type.

Your Program1 class inherits from object and do not override ToString(), so you are getting fully qualified name.

StringBuilder overrides ToString method which converting its value to string and you are getting "Web World!!" string

Upvotes: 0

tmaj
tmaj

Reputation: 34947

Console.WriteLine(prog); prints Program1 because

Every class or struct in C# implicitly inherits the Object class. Therefore, every object in C# gets the ToString method, which returns a string representation of that object. (From How to override the ToString method (C# Programming Guide))

and

Default implementations of the Object.ToString method return the fully qualified name of the object's type. (From reference for Object.ToString Method)

Here's an example of a class overriding ToString (from the first article)

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        return "Person: " + Name + " " + Age;
    }
}

Record types

It may be worth to mention record types.

From Records (C# reference):

Record types have a compiler-generated ToString method that displays the names and values of public properties and fields. The ToString method returns a string of the following format:

 <record type name> { <property name> = <value>, <property name> = <value>, ...}

Example

If Program1 becomes a record, and str1 becomes a property rather than a field

public record Program1
{
    public string Str1 { get; set; }
    public Program1(string str1)
    {
        Str1 = str1;
    }
} 

then

Program1 prog = new Program1("Hello");
Console.WriteLine(prog);

prints

Program1 { Str1 = Hello }

Upvotes: 1

ABray77
ABray77

Reputation: 121

This is because you the System does not know how it should print an object of type Program1, the way to tell the System how to print that type is to override the ToString method in the Program1 class. You can do this by simply adding:

public override string ToString() 
{
  return str1;
}

into the Program1 class. All C# objects naturally have this method but it will just return the class name (or some other value im not 100% sure) by default, we override this method to tell the System how to format an object of type Program1 as a string, allowing it to be printed correctly.

Upvotes: 4

Related Questions