Methode System.Object.ToString
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
Object.ToString is een algemene opmaakmethode in .NET. Het converteert een object naar de tekenreeksweergave, zodat het geschikt is voor weergave. (Zie voor informatie over opmaakondersteuning in .NET Opmaaktypen.) Standaard implementaties van de Object.ToString methode retourneren de volledig gekwalificeerde naam van het objecttype.
Belangrijk
Mogelijk hebt u deze pagina bereikt door de koppeling uit de ledenlijst van een ander type te volgen. Dat komt omdat dat type niet overschrijft Object.ToString. In plaats daarvan neemt deze de functionaliteit van de Object.ToString methode over.
Typen overschrijven de Object.ToString methode vaak om een meer geschikte tekenreeksweergave van een bepaald type te bieden. Typen overbelasten ook vaak de Object.ToString methode om ondersteuning te bieden voor opmaaktekenreeksen of cultuurgevoelige opmaak.
De standaardmethode Object.ToString()
De standaard implementatie van de ToString methode retourneert de volledig gekwalificeerde naam van het type, Objectzoals in het volgende voorbeeld wordt weergegeven.
Object obj = new Object();
Console.WriteLine(obj.ToString());
// The example displays the following output:
// System.Object
let obj = obj ()
printfn $"{obj.ToString()}"
// printfn $"{obj}" // Equivalent
// The example displays the following output:
// System.Object
Module Example3
Public Sub Main()
Dim obj As New Object()
Console.WriteLine(obj.ToString())
End Sub
End Module
' The example displays the following output:
' System.Object
Omdat Object dit de basisklasse is van alle referentietypen in .NET, wordt dit gedrag overgenomen door verwijzingstypen die de ToString methode niet overschrijven. In het volgende voorbeeld ziet u dit. Hiermee definieert u een klasse met de naam Object1
die de standaard implementatie van alle Object leden accepteert. De ToString methode retourneert de volledig gekwalificeerde typenaam van het object.
using System;
using Examples;
namespace Examples
{
public class Object1
{
}
}
public class Example5
{
public static void Main()
{
object obj1 = new Object1();
Console.WriteLine(obj1.ToString());
}
}
// The example displays the following output:
// Examples.Object1
type Object1() = class end
let obj1 = Object1()
printfn $"{obj1.ToString()}"
// The example displays the following output:
// Examples.Object1
Public Class Object1
End Class
Module Example4
Public Sub Main()
Dim obj1 As New Object1()
Console.WriteLine(obj1.ToString())
End Sub
End Module
' The example displays the following output:
' Examples.Object1
De methode Object.ToString() overschrijven
Typen overschrijven de Object.ToString methode meestal om een tekenreeks te retourneren die het objectexemplaren vertegenwoordigt. De basistypen zoals Char, Int32en String bieden ToString bijvoorbeeld implementaties die de tekenreeksvorm retourneren van de waarde die het object vertegenwoordigt. In het volgende voorbeeld wordt een klasse gedefinieerd, Object2
waarmee de ToString methode wordt overschreven om de typenaam samen met de bijbehorende waarde te retourneren.
using System;
public class Object2
{
private object value;
public Object2(object value)
{
this.value = value;
}
public override string ToString()
{
return base.ToString() + ": " + value.ToString();
}
}
public class Example6
{
public static void Main()
{
Object2 obj2 = new Object2('a');
Console.WriteLine(obj2.ToString());
}
}
// The example displays the following output:
// Object2: a
type Object2(value: obj) =
inherit obj ()
override _.ToString() =
base.ToString() + ": " + value.ToString()
let obj2 = Object2 'a'
printfn $"{obj2.ToString()}"
// The example displays the following output:
// Object2: a
Public Class Object2
Private value As Object
Public Sub New(value As Object)
Me.value = value
End Sub
Public Overrides Function ToString() As String
Return MyBase.ToString + ": " + value.ToString()
End Function
End Class
Module Example5
Public Sub Main()
Dim obj2 As New Object2("a"c)
Console.WriteLine(obj2.ToString())
End Sub
End Module
' The example displays the following output:
' Object2: a
De volgende tabel bevat de typecategorieën in .NET en geeft aan of ze de Object.ToString methode al dan niet overschrijven.
Typecategorie | Overschrijft Object.ToString() | Gedrag |
---|---|---|
Klasse | N.v.t. | N.v.t. |
Structuur | Ja (ValueType.ToString) | Hetzelfde als Object.ToString() |
Inventarisatie | Ja (Enum.ToString()) | De lidnaam |
Interface | Nee | N.v.t. |
Gemachtigde | Nee | N.v.t. |
Zie de sectie Notities voor overnames voor aanvullende informatie over het overschrijven ToString.
De ToString-methode overbelasten
Naast het overschrijven van de methode zonder Object.ToString() parameters, overbelasten veel typen de ToString
methode om versies van de methode te bieden die parameters accepteren. Dit wordt meestal gedaan om ondersteuning te bieden voor variabele opmaak en cultuurgevoelige opmaak.
In het volgende voorbeeld wordt de ToString
methode overbelast om een resultaattekenreeks te retourneren die de waarde van verschillende velden van een Automobile
klasse bevat. Hiermee worden vier notatietekenreeksen gedefinieerd: G, die de modelnaam en het jaar retourneert; D, die de modelnaam, het jaar en het aantal deuren retourneert; C, die de modelnaam, het jaar en het aantal cilinders retourneert; en A, die een tekenreeks met alle vier veldwaarden retourneert.
using System;
public class Automobile
{
private int _doors;
private string _cylinders;
private int _year;
private string _model;
public Automobile(string model, int year , int doors,
string cylinders)
{
_model = model;
_year = year;
_doors = doors;
_cylinders = cylinders;
}
public int Doors
{ get { return _doors; } }
public string Model
{ get { return _model; } }
public int Year
{ get { return _year; } }
public string Cylinders
{ get { return _cylinders; } }
public override string ToString()
{
return ToString("G");
}
public string ToString(string fmt)
{
if (string.IsNullOrEmpty(fmt))
fmt = "G";
switch (fmt.ToUpperInvariant())
{
case "G":
return string.Format("{0} {1}", _year, _model);
case "D":
return string.Format("{0} {1}, {2} dr.",
_year, _model, _doors);
case "C":
return string.Format("{0} {1}, {2}",
_year, _model, _cylinders);
case "A":
return string.Format("{0} {1}, {2} dr. {3}",
_year, _model, _doors, _cylinders);
default:
string msg = string.Format("'{0}' is an invalid format string",
fmt);
throw new ArgumentException(msg);
}
}
}
public class Example7
{
public static void Main()
{
var auto = new Automobile("Lynx", 2016, 4, "V8");
Console.WriteLine(auto.ToString());
Console.WriteLine(auto.ToString("A"));
}
}
// The example displays the following output:
// 2016 Lynx
// 2016 Lynx, 4 dr. V8
open System
type Automobile(model: string, year: int, doors: int, cylinders: string) =
member _.Doors = doors
member _.Model = model
member _.Year = year
member _.Cylinders = cylinders
override this.ToString() =
this.ToString "G"
member _.ToString(fmt) =
let fmt =
if String.IsNullOrEmpty fmt then "G"
else fmt.ToUpperInvariant()
match fmt with
| "G" ->
$"{year} {model}"
| "D" ->
$"{year} {model}, {doors} dr."
| "C" ->
$"{year} {model}, {cylinders}"
| "A" ->
$"{year} {model}, {doors} dr. {cylinders}"
| _ ->
raise (ArgumentException $"'{fmt}' is an invalid format string")
let auto = Automobile("Lynx", 2016, 4, "V8")
printfn $"{auto}"
printfn $"""{auto.ToString "A"}"""
// The example displays the following output:
// 2016 Lynx
// 2016 Lynx, 4 dr. V8
Public Class Automobile
Private _doors As Integer
Private _cylinders As String
Private _year As Integer
Private _model As String
Public Sub New(model As String, year As Integer, doors As Integer,
cylinders As String)
_model = model
_year = year
_doors = doors
_cylinders = cylinders
End Sub
Public ReadOnly Property Doors As Integer
Get
Return _doors
End Get
End Property
Public ReadOnly Property Model As String
Get
Return _model
End Get
End Property
Public ReadOnly Property Year As Integer
Get
Return _year
End Get
End Property
Public ReadOnly Property Cylinders As String
Get
Return _cylinders
End Get
End Property
Public Overrides Function ToString() As String
Return ToString("G")
End Function
Public Overloads Function ToString(fmt As String) As String
If String.IsNullOrEmpty(fmt) Then fmt = "G"
Select Case fmt.ToUpperInvariant()
Case "G"
Return String.Format("{0} {1}", _year, _model)
Case "D"
Return String.Format("{0} {1}, {2} dr.",
_year, _model, _doors)
Case "C"
Return String.Format("{0} {1}, {2}",
_year, _model, _cylinders)
Case "A"
Return String.Format("{0} {1}, {2} dr. {3}",
_year, _model, _doors, _cylinders)
Case Else
Dim msg As String = String.Format("'{0}' is an invalid format string",
fmt)
Throw New ArgumentException(msg)
End Select
End Function
End Class
Module Example6
Public Sub Main()
Dim auto As New Automobile("Lynx", 2016, 4, "V8")
Console.WriteLine(auto.ToString())
Console.WriteLine(auto.ToString("A"))
End Sub
End Module
' The example displays the following output:
' 2016 Lynx
' 2016 Lynx, 4 dr. V8
In het volgende voorbeeld wordt de overbelaste Decimal.ToString(String, IFormatProvider) methode aangeroepen om cultuurgevoelige opmaak van een valutawaarde weer te geven.
using System;
using System.Globalization;
public class Example8
{
public static void Main()
{
string[] cultureNames = { "en-US", "en-GB", "fr-FR",
"hr-HR", "ja-JP" };
Decimal value = 1603.49m;
foreach (var cultureName in cultureNames) {
CultureInfo culture = new CultureInfo(cultureName);
Console.WriteLine("{0}: {1}", culture.Name,
value.ToString("C2", culture));
}
}
}
// The example displays the following output:
// en-US: $1,603.49
// en-GB: £1,603.49
// fr-FR: 1 603,49 €
// hr-HR: 1.603,49 kn
// ja-JP: ¥1,603.49
open System.Globalization
let cultureNames =
[| "en-US"; "en-GB"; "fr-FR"; "hr-HR"; "ja-JP" |]
let value = 1603.49m
for cultureName in cultureNames do
let culture = CultureInfo cultureName
printfn $"""{culture.Name}: {value.ToString("C2", culture)}"""
// The example displays the following output:
// en-US: $1,603.49
// en-GB: £1,603.49
// fr-FR: 1 603,49 €
// hr-HR: 1.603,49 kn
// ja-JP: ¥1,603.49
Imports System.Globalization
Module Example7
Public Sub Main()
Dim cultureNames() As String = {"en-US", "en-GB", "fr-FR",
"hr-HR", "ja-JP"}
Dim value As Decimal = 1603.49D
For Each cultureName In cultureNames
Dim culture As New CultureInfo(cultureName)
Console.WriteLine("{0}: {1}", culture.Name,
value.ToString("C2", culture))
Next
End Sub
End Module
' The example displays the following output:
' en-US: $1,603.49
' en-GB: £1,603.49
' fr-FR: 1 603,49 €
' hr-HR: 1.603,49 kn
' ja-JP: ¥1,603.49
Zie Opmaaktypen voor meer informatie over opmaaktekenreeksen en cultuurgevoelige opmaak. Zie Standard Numeric Format Strings and Custom Numeric Format Strings and Custom Numeric Format Strings (Tekenreeksen met aangepaste numerieke notatie) voor de notatietekenreeksen die worden ondersteund door numerieke waarden. Zie Voor de notatietekenreeksen die worden ondersteund door datum- en tijdwaarden, standaard tekenreeksen voor datum- en tijdnotatie en aangepaste datum- en tijdnotatietekenreeksen.
De methode Object.ToString uitbreiden
Omdat een type de standaardmethode Object.ToString overneemt, is het gedrag mogelijk ongewenst en wilt u deze wijzigen. Dit geldt met name voor matrices en verzamelingsklassen. Hoewel u kunt verwachten dat de ToString
methode van een matrix- of verzamelingsklasse de waarden van de leden weergeeft, wordt in plaats daarvan de volledig gekwalificeerde typenaam weergegeven, zoals in het volgende voorbeeld wordt weergegeven.
int[] values = { 1, 2, 4, 8, 16, 32, 64, 128 };
Console.WriteLine(values.ToString());
List<int> list = new List<int>(values);
Console.WriteLine(list.ToString());
// The example displays the following output:
// System.Int32[]
// System.Collections.Generic.List`1[System.Int32]
let values = [| 1; 2; 4; 8; 16; 32; 64; 128 |]
printfn $"{values}"
let list = ResizeArray values
printfn $"{list}"
// The example displays the following output:
// System.Int32[]
// System.Collections.Generic.List`1[System.Int32]
Imports System.Collections.Generic
Module Example
Public Sub Main()
Dim values() As Integer = { 1, 2, 4, 8, 16, 32, 64, 128 }
Console.WriteLine(values.ToString())
Dim list As New List(Of Integer)(values)
Console.WriteLine(list.ToString())
End Sub
End Module
' The example displays the following output:
' System.Int32[]
' System.Collections.Generic.List`1[System.Int32]
U hebt verschillende opties om de gewenste resultaattekenreeks te produceren.
Als het type een matrix, een verzamelingsobject of een object is dat de IEnumerable of IEnumerable<T> interfaces implementeert, kunt u de elementen inventariseren met behulp van de
foreach
instructie in C# of deFor Each...Next
constructie in Visual Basic.Als de klasse niet
sealed
(in C#) ofNotInheritable
(in Visual Basic) is, kunt u een wrapperklasse ontwikkelen die overgaat van de basisklasse waarvan Object.ToString u de methode wilt aanpassen. Hiervoor moet u minimaal het volgende doen:- Implementeer alle benodigde constructors. Afgeleide klassen nemen hun basisklasseconstructors niet over.
- Overschrijf de Object.ToString methode om de gewenste resultaattekenreeks te retourneren.
In het volgende voorbeeld wordt een wrapper-klasse voor de List<T> klasse gedefinieerd. De methode wordt overschreven Object.ToString om de waarde van elke methode van de verzameling weer te geven in plaats van de volledig gekwalificeerde typenaam.
using System; using System.Collections.Generic; public class CList<T> : List<T> { public CList(IEnumerable<T> collection) : base(collection) { } public CList() : base() {} public override string ToString() { string retVal = string.Empty; foreach (T item in this) { if (string.IsNullOrEmpty(retVal)) retVal += item.ToString(); else retVal += string.Format(", {0}", item); } return retVal; } } public class Example2 { public static void Main() { var list2 = new CList<int>(); list2.Add(1000); list2.Add(2000); Console.WriteLine(list2.ToString()); } } // The example displays the following output: // 1000, 2000
open System open System.Collections.Generic type CList<'T>() = inherit ResizeArray<'T>() override this.ToString() = let mutable retVal = String.Empty for item in this do if String.IsNullOrEmpty retVal then retVal <- retVal + string item else retVal <- retVal + $", {item}" retVal let list2 = CList() list2.Add 1000 list2.Add 2000 printfn $"{list2}" // The example displays the following output: // 1000, 2000
Imports System.Collections.Generic Public Class CList(Of T) : Inherits List(Of T) Public Sub New(capacity As Integer) MyBase.New(capacity) End Sub Public Sub New(collection As IEnumerable(Of T)) MyBase.New(collection) End Sub Public Sub New() MyBase.New() End Sub Public Overrides Function ToString() As String Dim retVal As String = String.Empty For Each item As T In Me If String.IsNullOrEmpty(retval) Then retVal += item.ToString() Else retval += String.Format(", {0}", item) End If Next Return retVal End Function End Class Module Example1 Public Sub Main() Dim list2 As New CList(Of Integer) list2.Add(1000) list2.Add(2000) Console.WriteLine(list2.ToString()) End Sub End Module ' The example displays the following output: ' 1000, 2000
Ontwikkel een extensiemethode die de gewenste resultaattekenreeks retourneert. Houd er rekening mee dat u de standaardmethode Object.ToString op deze manier niet kunt overschrijven. Dat wil gezegd: uw extensieklasse (in C#) of module (in Visual Basic) kan geen parameterloze methode hebben met de naam
ToString
die wordt aangeroepen in plaats van de methode van het oorspronkelijke typeToString
. U moet een andere naam opgeven voor uw parameterlozeToString
vervanging.In het volgende voorbeeld worden twee methoden gedefinieerd waarmee de List<T> klasse wordt uitgebreid: een methode zonder
ToString2
parameters en een methode met eenToString
String parameter die een notatietekenreeks vertegenwoordigt.using System; using System.Collections.Generic; public static class StringExtensions { public static string ToString2<T>(this List<T> l) { string retVal = string.Empty; foreach (T item in l) retVal += string.Format("{0}{1}", string.IsNullOrEmpty(retVal) ? "" : ", ", item); return string.IsNullOrEmpty(retVal) ? "{}" : "{ " + retVal + " }"; } public static string ToString<T>(this List<T> l, string fmt) { string retVal = string.Empty; foreach (T item in l) { IFormattable ifmt = item as IFormattable; if (ifmt != null) retVal += string.Format("{0}{1}", string.IsNullOrEmpty(retVal) ? "" : ", ", ifmt.ToString(fmt, null)); else retVal += ToString2(l); } return string.IsNullOrEmpty(retVal) ? "{}" : "{ " + retVal + " }"; } } public class Example3 { public static void Main() { List<int> list = new List<int>(); list.Add(1000); list.Add(2000); Console.WriteLine(list.ToString2()); Console.WriteLine(list.ToString("N0")); } } // The example displays the following output: // { 1000, 2000 } // { 1,000, 2,000 }
open System open System.Collections.Generic type List<'T> with member this.ToString2<'T>() = let mutable retVal = String.Empty for item in this do retVal <- retVal + $"""{if String.IsNullOrEmpty retVal then "" else ", "}{item}""" if String.IsNullOrEmpty retVal then "{}" else "{ " + retVal + " }" member this.ToString<'T>(fmt: string) = let mutable retVal = String.Empty for item in this do match box item with | :? IFormattable as ifmt -> retVal <- retVal + $"""{if String.IsNullOrEmpty retVal then "" else ", "}{ifmt.ToString(fmt, null)}""" | _ -> retVal <- retVal + this.ToString2() if String.IsNullOrEmpty retVal then "{}" else "{ " + retVal + " }" let list = ResizeArray() list.Add 1000 list.Add 2000 printfn $"{list.ToString2()}" printfn $"""{list.ToString "N0"}""" // The example displays the following output: // { 1000, 2000 } // { 1,000, 2,000 }
Imports System.Collections.Generic Imports System.Runtime.CompilerServices Public Module StringExtensions <Extension()> Public Function ToString2(Of T)(l As List(Of T)) As String Dim retVal As String = "" For Each item As T In l retVal += String.Format("{0}{1}", If(String.IsNullOrEmpty(retVal), "", ", "), item) Next Return If(String.IsNullOrEmpty(retVal), "{}", "{ " + retVal + " }") End Function <Extension()> Public Function ToString(Of T)(l As List(Of T), fmt As String) As String Dim retVal As String = String.Empty For Each item In l Dim ifmt As IFormattable = TryCast(item, IFormattable) If ifmt IsNot Nothing Then retVal += String.Format("{0}{1}", If(String.IsNullOrEmpty(retval), "", ", "), ifmt.ToString(fmt, Nothing)) Else retVal += ToString2(l) End If Next Return If(String.IsNullOrEmpty(retVal), "{}", "{ " + retVal + " }") End Function End Module Module Example2 Public Sub Main() Dim list As New List(Of Integer) list.Add(1000) list.Add(2000) Console.WriteLine(list.ToString2()) Console.WriteLine(list.ToString("N0")) End Sub End Module ' The example displays the following output: ' { 1000, 2000 } ' { 1,000, 2,000 }
Notities voor Windows Runtime
Wanneer u de ToString methode aanroept voor een klasse in Windows Runtime, biedt deze het standaardgedrag voor klassen die niet worden overschreven ToString. Dit maakt deel uit van de ondersteuning die .NET biedt voor Windows Runtime (zie .NET-ondersteuning voor Windows Store-apps en Windows Runtime). Klassen in De Windows Runtime nemen geen overname Objectover en implementeren niet altijd een ToString. Ze lijken echter altijd , Equals(Object)en GetHashCode methoden te hebben ToStringwanneer u ze gebruikt in uw C# of Visual Basic-code, en .NET biedt een standaardgedrag voor deze methoden.
De algemene taalruntime maakt gebruik van IStringable.ToString op een Windows Runtime-object voordat u terugvalt op de standaard implementatie van Object.ToString.
Notitie
Windows Runtime-klassen die zijn geschreven in C# of Visual Basic, kunnen de ToString methode overschrijven.
De Windows Runtime en de IStringable-interface
De Windows Runtime bevat een IStringable-interface waarvan één methode, IStringable.ToString, biedt basisopmaakondersteuning die vergelijkbaar is met die van Object.ToString. Als u dubbelzinnigheid wilt voorkomen, moet u IStringable niet implementeren op beheerde typen.
Wanneer beheerde objecten worden aangeroepen door systeemeigen code of door code die is geschreven in talen zoals JavaScript of C++/CX, lijken ze IStringable te implementeren. De algemene taalruntime routeert automatisch aanroepen van IStringable.ToString naar Object.ToString als IStringable niet is geïmplementeerd op het beheerde object.
Waarschuwing
Omdat de algemene taalruntime automatisch IStringable implementeert voor alle beheerde typen in Windows Store-apps, raden we u aan uw eigen IStringable
implementatie niet te bieden. Implementatie IStringable
kan leiden tot onbedoeld gedrag bij het aanroepen ToString
vanuit Windows Runtime, C++/CX of JavaScript.
Als u ervoor kiest om IStringable te implementeren in een openbaar beheerd type dat wordt geëxporteerd in een Windows Runtime-onderdeel, gelden de volgende beperkingen:
U kunt de IStringable-interface alleen definiëren in een 'klasse implementeert' als volgt:
public class NewClass : IStringable
Public Class NewClass : Implements IStringable
U kunt IStringable niet implementeren op een interface.
U kunt geen parameter declareren om van het type IStringable te zijn.
IStringable kan niet het retourtype van een methode, eigenschap of veld zijn.
U kunt uw IStringable-implementatie niet verbergen voor basisklassen met behulp van een methodedefinitie zoals:
public class NewClass : IStringable { public new string ToString() { return "New ToString in NewClass"; } }
In plaats daarvan moet de IStringable.ToString-implementatie altijd de basisklasse-implementatie overschrijven. U kunt een
ToString
implementatie alleen verbergen door deze aan te roepen op een sterk getypt klasse-exemplaar.
Onder verschillende omstandigheden kunnen aanroepen van systeemeigen code naar een beheerd type dat IStringable implementeert of de ToString-implementatie verbergt onverwacht gedrag opleveren.