Delen via


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, Object2waarmee 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 de For Each...Next constructie in Visual Basic.

  • Als de klasse niet sealed (in C#) of NotInheritable (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:

    1. Implementeer alle benodigde constructors. Afgeleide klassen nemen hun basisklasseconstructors niet over.
    2. 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 type ToString . U moet een andere naam opgeven voor uw parameterloze ToString 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 een ToStringString 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.