Bagikan melalui


Metode System.Object.ToString

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Object.ToString adalah metode pemformatan umum di .NET. Ini mengonversi objek ke representasi stringnya sehingga cocok untuk ditampilkan. (Untuk informasi tentang dukungan pemformatan di .NET, lihat Tipe Pemformatan.) Implementasi Object.ToString default metode mengembalikan nama yang sepenuhnya memenuhi syarat dari jenis objek.

Penting

Anda mungkin telah mencapai halaman ini dengan mengikuti tautan dari daftar anggota tipe lain. Itu karena jenis tersebut tidak mengambil alih Object.ToString. Sebaliknya, ia mewarisi fungsionalitas Object.ToString metode .

Jenis sering mengambil alih Object.ToString metode untuk memberikan representasi string yang lebih cocok dari jenis tertentu. Jenis juga sering membebani Object.ToString metode untuk memberikan dukungan untuk string format atau pemformatan sensitif budaya.

Metode Object.ToString() default

Implementasi ToString default metode mengembalikan nama yang sepenuhnya memenuhi syarat dari jenis Object, seperti yang ditunjukkan contoh berikut.

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

Karena Object adalah kelas dasar dari semua jenis referensi di .NET, perilaku ini diwarisi oleh jenis referensi yang tidak mengambil alih ToString metode. Contoh berikut mengilustrasikan langkah-langkah ini: Ini mendefinisikan kelas bernama Object1 yang menerima implementasi default semua Object anggota. Metodenya ToString mengembalikan nama jenis objek yang sepenuhnya memenuhi syarat.

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

Mengambil alih metode Object.ToString()

Jenis umumnya Object.ToString mengambil alih metode untuk mengembalikan string yang mewakili instans objek. Misalnya, jenis dasar seperti Char, Int32, dan String menyediakan ToString implementasi yang mengembalikan bentuk string dari nilai yang diwakili objek. Contoh berikut mendefinisikan kelas, Object2, yang mengambil ToString alih metode untuk mengembalikan nama jenis bersama dengan nilainya.

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

Tabel berikut mencantumkan kategori jenis di .NET dan menunjukkan apakah mereka mengambil alih Object.ToString metode atau tidak.

Jenis kategori Mengambil alih Object.ToString() Perilaku
Kelas n/a n/a
Struktur Ya (ValueType.ToString) Sama seperti Object.ToString()
Enumeration Ya (Enum.ToString()) Nama anggota
Antarmuka No n/a
Delegasikan No n/a

Lihat bagian Catatan untuk Pewaris untuk informasi tambahan tentang penimpaan ToString.

Membebani metode ToString

Selain mengesampingkan metode tanpa Object.ToString() parameter, banyak jenis membebani ToString metode untuk menyediakan versi metode yang menerima parameter. Paling umum, ini dilakukan untuk memberikan dukungan untuk pemformatan variabel dan pemformatan sensitif budaya.

Contoh berikut membebani ToString metode untuk mengembalikan string hasil yang menyertakan nilai berbagai bidang Automobile kelas. Ini mendefinisikan empat string format: G, yang mengembalikan nama model dan tahun; D, yang mengembalikan nama model, tahun, dan jumlah pintu; C, yang mengembalikan nama model, tahun, dan jumlah silinder; dan A, yang mengembalikan string dengan keempat nilai bidang.

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

Contoh berikut memanggil metode yang kelebihan Decimal.ToString(String, IFormatProvider) beban untuk menampilkan pemformatan sensitif budaya dari nilai mata uang.

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

Untuk informasi selengkapnya tentang string format dan pemformatan sensitif budaya, lihat Tipe Pemformatan. Untuk string format yang didukung oleh nilai numerik, lihat String Format Numerik Standar dan String Format Numerik Kustom. Untuk string format yang didukung oleh nilai tanggal dan waktu, lihat String Format Tanggal dan Waktu Standar serta String Format Tanggal dan Waktu Kustom.

Memperluas metode Object.ToString

Karena jenis mewarisi metode default Object.ToString , Anda mungkin menemukan perilakunya tidak diinginkan dan ingin mengubahnya. Ini terutama berlaku untuk array dan kelas koleksi. Meskipun Anda mungkin mengharapkan ToString metode kelas array atau koleksi untuk menampilkan nilai anggotanya, metode tersebut akan menampilkan nama jenis yang sepenuhnya memenuhi syarat, seperti yang ditunjukkan contoh berikut.

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]

Anda memiliki beberapa opsi untuk menghasilkan string hasil yang Anda inginkan.

  • Jika jenisnya adalah array, objek koleksi, atau objek yang mengimplementasikan IEnumerable antarmuka atau IEnumerable<T> , Anda dapat menghitung elemennya dengan menggunakan foreach pernyataan di C# atau For Each...Next konstruksi di Visual Basic.

  • Jika kelas bukan sealed (dalam C#) atau NotInheritable (di Visual Basic), Anda dapat mengembangkan kelas pembungkus yang mewarisi dari kelas dasar yang metodenya Object.ToString ingin Anda sesuaikan. Minimal, ini mengharuskan Anda melakukan hal berikut:

    1. Terapkan konstruktor yang diperlukan. Kelas turunan tidak mewarisi konstruktor kelas dasar mereka.
    2. Ambil alih Object.ToString metode untuk mengembalikan string hasil yang Anda inginkan.

    Contoh berikut mendefinisikan kelas pembungkus untuk List<T> kelas . Ini mengambil alih Object.ToString metode untuk menampilkan nilai setiap metode koleksi daripada nama jenis yang sepenuhnya memenuhi syarat.

    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
    
  • Kembangkan metode ekstensi yang mengembalikan string hasil yang Anda inginkan. Perhatikan bahwa Anda tidak dapat mengambil alih metode default Object.ToString dengan cara ini—yaitu, kelas ekstensi Anda (dalam C#) atau modul (di Visual Basic) tidak dapat memiliki metode tanpa parameter bernama ToString yang disebut sebagai pengganti metode jenis ToString asli. Anda harus memberikan beberapa nama lain untuk penggantian tanpa ToString parameter Anda.

    Contoh berikut mendefinisikan dua metode yang memperluas List<T> kelas: metode tanpa ToString2 parameter, dan ToString metode dengan String parameter yang mewakili string format.

    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 }
    

Catatan untuk Windows Runtime

Ketika Anda memanggil ToString metode pada kelas di Windows Runtime, metode ini menyediakan perilaku default untuk kelas yang tidak mengambil alih ToString. Ini adalah bagian dari dukungan yang disediakan .NET untuk Windows Runtime (lihat Dukungan .NET untuk Aplikasi Windows Store dan Runtime Windows). Kelas di Windows Runtime tidak mewarisi Object, dan tidak selalu menerapkan ToString. Namun, mereka selalu tampak memiliki ToStringmetode , Equals(Object), dan GetHashCode ketika Anda menggunakannya dalam kode C# atau Visual Basic Anda, dan .NET menyediakan perilaku default untuk metode ini.

Runtime bahasa umum menggunakan IStringable.ToString pada objek Windows Runtime sebelum kembali ke implementasi Object.ToStringdefault .

Catatan

Kelas Windows Runtime yang ditulis dalam C# atau Visual Basic dapat mengambil ToString alih metode .

Windows Runtime dan IStringable Interface

Windows Runtime mencakup antarmuka IStringable yang metode tunggalnya, IStringable.ToString, menyediakan dukungan pemformatan dasar yang sebanding dengan yang disediakan oleh Object.ToString. Untuk mencegah ambiguitas, Anda tidak boleh menerapkan IStringable pada jenis terkelola .

Ketika objek terkelola dipanggil oleh kode asli atau dengan kode yang ditulis dalam bahasa seperti JavaScript atau C++/CX, objek tersebut tampaknya mengimplementasikan IStringable. Runtime bahasa umum secara otomatis merutekan panggilan dari IStringable.ToString ke Object.ToString jika IStringable tidak diterapkan pada objek terkelola.

Peringatan

Karena runtime bahasa umum mengimplementasikan IStringable secara otomatis untuk semua jenis terkelola di aplikasi Windows Store, kami sarankan Anda tidak menyediakan implementasi Anda sendiri IStringable . Penerapan IStringable dapat mengakibatkan perilaku yang tidak diinginkan saat memanggil ToString dari Windows Runtime, C++/CX, atau JavaScript.

Jika Anda memilih untuk menerapkan IStringable dalam jenis terkelola publik yang diekspor dalam komponen Windows Runtime, pembatasan berikut berlaku:

  • Anda dapat menentukan antarmuka IStringable hanya dalam hubungan "class implements", sebagai berikut:

    public class NewClass : IStringable
    
    Public Class NewClass : Implements IStringable
    
  • Anda tidak dapat menerapkan IStringable pada antarmuka.

  • Anda tidak dapat mendeklarasikan parameter berjenis IStringable.

  • IStringable tidak dapat menjadi jenis pengembalian metode, properti, atau bidang.

  • Anda tidak dapat menyembunyikan implementasi IStringable Anda dari kelas dasar dengan menggunakan definisi metode seperti berikut:

    public class NewClass : IStringable
    {
       public new string ToString()
       {
          return "New ToString in NewClass";
       }
    }
    

    Sebaliknya, implementasi IStringable.ToString harus selalu mengambil alih implementasi kelas dasar. Anda hanya dapat menyembunyikan ToString implementasi dengan memanggilnya pada instans kelas yang sangat ditik.

Dalam berbagai kondisi, panggilan dari kode asli ke jenis terkelola yang mengimplementasikan IStringable atau menyembunyikan implementasi ToString-nya dapat menghasilkan perilaku yang tidak terduga.