I have a question about the following code:
class CurrentDate
{
static void Main()
{
Console.WriteLine(DateTime.Now);
}
}
Documentation says:
Writes the text representation of the specified array of objects, followed by the current line terminator, to the standard output stream using the specified format information.
So my question is: How come WriteLine
knows the text representation of DateTime
object? I mean, if I create my own object from my own class, how would it know how to convert the value to text? And even more, how does it know what the value is? How can you define "value" of an object?
WriteLine(String, Object, Object) Writes the text representation of the specified objects, followed by the current line terminator, to the standard output stream using the specified format information.
The only difference between the write() and writelines() is that write() is used to write a string to an already opened file while writelines() method is used to write a list of strings in an opened file.
And {0} Is a formatted message, When you define It to {0} It means printing/formatting the zero Index object that you Inserted Into params arguments of your function. It's a zero based number that gets the index of object you want, Here's an example: Console.
In C# you can write or print to console using Console. WriteLine() or Console. Write(), basically both methods are used to print output of console.
How come WriteLine knows the text representation of DateTime object? I mean, if I create my own object from my own class, how would it know how to convert the value to text?
Console.WriteLine
has a set of overloads matching specific types (mainly primitives). If the compiler doesn't match an overload with the provided type, it matches with the overload taking System.Object
(granted you provide a single parameter). If that happens, it checks to see if the type implements IFormattable
, if it does, it invokes IFormattable.ToString(null, Formatter)
. If it doesn't, it invokes ToString
on your object. ToString
is defined in System.Object
, which all objects inherit from. Every object that wants a custom representation overrides the default behavior, like DateTime
does.
For example, lets say you have a Foo
class with a Bar
string property, and you want Console.WriteLine
to print something meaningful when passing your Foo
to it:
public class Foo
{
public string Bar { get; set; }
public override string ToString()
{
return Bar;
}
}
And now we want to pass it Console.WriteLine
:
public static void Main(string[] args)
{
var foo = new Foo { Bar = "bar" };
Console.WriteLine(foo);
}
Would yield "bar".
Since there is no overload for Console.WriteLine(DateTime)
,as in your case,the Console.WriteLine(Object)
overload is called and this overload calls the TextWriter.WriteLine(object)
overload which is implemented as:
IFormattable f = value as IFormattable;
if (f != null)
WriteLine(f.ToString(null, FormatProvider));
else
WriteLine(value.ToString());
As you can see, this method checks if this object type implements IFormattable
interface or not. Since Datetime
implements this interface, your f.ToString(null, FormatProvider)
will be called. From this method's documentation the first parameter is:
A null reference (Nothing in Visual Basic) to use the default format defined for the type of the IFormattable implementation.
And from the DateTime.ToString(String, IFormatProvider)
method's documentation:
If format is null or an empty string (""), the standard format specifier,
"G"
., is used.
That means, the representation will be a combination of the ShortDatePattern
and LongTimePattern
properties belonging to your CurrentCulture
If you want a special format for your custom class, you can override the .ToString()
method of your type to change its behaviour.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With