Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 default metode Object.ToString 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 metode Object.ToString.
Tipe sering mengoverride metode Object.ToString untuk memberikan representasi string yang lebih sesuai untuk tipe tertentu. Jenis juga sering membebani metode Object.ToString untuk memberikan dukungan untuk string format atau pemformatan sensitif budaya.
Metode default Object.ToString()
Implementasi default metode ToString 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 diwariskan oleh jenis referensi yang tidak mengambil alih metode ToString. Contoh berikut mengilustrasikan hal ini. Ini mendefinisikan kelas bernama Object1 yang menerima implementasi default semua anggota Object. Metode ToString mengembalikan nama tipe 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
Mengganti metode Object.ToString()
Jenis umumnya mengambil alih metode Object.ToString untuk mengembalikan string yang mewakili instans objek. Misalnya, jenis dasar seperti Char, Int32, dan String menyediakan implementasi ToString yang mengembalikan bentuk string dari nilai yang diwakili objek. Contoh berikut mendefinisikan kelas, Object2, yang mengambil alih metode ToString 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 metode Object.ToString atau tidak.
| Jenis kategori | Menimpa Object.ToString() | Perilaku |
|---|---|---|
| Kelas | N/a | N/a |
| Struktur | Ya (ValueType.ToString) | Sama seperti Object.ToString() |
| Enumerasi | Ya (Enum.ToString()) | Nama anggota |
| Antarmuka | Tidak | N/a |
| Mendelegasikan | Tidak | N/a |
Lihat bagian Catatan untuk Pewaris untuk informasi tambahan tentang mengambil alih ToString.
Melakukan overload pada metode ToString
Selain mengesampingkan metode Object.ToString() tanpa parameter, banyak jenis membebani metode ToString untuk menyediakan versi metode yang menerima parameter. Paling umum, ini dilakukan untuk memberikan dukungan untuk pemformatan variabel dan pemformatan sensitif budaya.
Contoh berikut membebani metode ToString untuk mengembalikan string hasil yang menyertakan nilai berbagai bidang kelas Automobile. 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 Decimal.ToString(String, IFormatProvider) yang kelebihan 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($"{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 dan String Format Tanggal dan Waktu Kustom.
Memperluas metode Object.ToString
Karena jenis mewarisi metode Object.ToString default, Anda mungkin menemukan perilakunya tidak diinginkan dan ingin mengubahnya. Ini terutama berlaku untuk array dan kelas koleksi. Meskipun Anda mungkin mengharapkan metode ToString dari kelas array atau koleksi menampilkan nilai dari anggotanya, malah menampilkan nama tipe yang sepenuhnya memenuhi kualifikasi, seperti yang ditunjukkan dalam 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 antarmuka IEnumerable atau IEnumerable<T>, Anda dapat menghitung elemennya dengan menggunakan pernyataan
foreachdi C# atau konstruksiFor Each...Nextdi Visual Basic.Jika kelas tidak
sealed(dalam C#) atauNotInheritable(di Visual Basic), Anda dapat mengembangkan kelas pembungkus yang mewarisi dari kelas dasar yang metode Object.ToString nya ingin Anda sesuaikan. Minimal, ini mengharuskan Anda melakukan hal berikut:- Terapkan konstruktor yang diperlukan. Kelas turunan tidak mewarisi konstruktor kelas dasar mereka.
- Ambil alih metode Object.ToString untuk mengembalikan string hasil yang Anda inginkan.
Contoh berikut mendefinisikan kelas pembungkus untuk kelas List<T>. Ini mengambil alih metode Object.ToString 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, 2000open 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, 2000Imports 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, 2000Kembangkan metode ekstensi yang mengembalikan string hasil yang Anda inginkan. Perhatikan bahwa Anda tidak dapat mengambil alih metode Object.ToString default dengan cara ini—yaitu, kelas ekstensi Anda (dalam C#) atau modul (di Visual Basic) tidak dapat memiliki metode tanpa parameter bernama
ToStringyang dipanggil sebagai pengganti metodeToStringjenis asli. Anda harus memberikan nama lain untuk penggantianToStringyang tanpa parameter.Contoh berikut mendefinisikan dua metode yang memperluas kelas List<T>: metode
ToString2tanpa parameter, dan metodeToStringdengan parameter String 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 metode ToString 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 Windows Runtime). Kelas di Windows Runtime tidak mewarisi Object, dan tidak selalu menerapkan ToString. Namun, mereka selalu tampak memiliki metode ToString, Equals(Object), dan GetHashCode ketika Anda menggunakannya dalam kode C# atau Visual Basic Anda, dan .NET menyediakan perilaku default untuk metode ini.
Lingkungan eksekusi bahasa umum menggunakan IStringable.ToString pada objek Windows Runtime sebelum kembali ke implementasi default Object.ToString.
Nota
Kelas Windows Runtime yang ditulis dalam C# atau Visual Basic dapat mengambil alih metode ToString.
Windows Runtime dan IStringable Interface
Windows Runtime menyertakan 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 tipe terkelola.
Ketika objek terkelola dipanggil oleh kode bawaan atau oleh kode yang ditulis dalam bahasa seperti JavaScript atau C++/CX, mereka tampaknya menerapkan IStringable. Runtime bahasa umum secara otomatis merutekan panggilan dari IStringable.ToString ke Object.ToString jika IStringable tidak diterapkan pada objek terkelola.
Peringatan
Karena common language runtime mengimplementasi otomatis IStringable untuk semua tipe yang dikelola di aplikasi Windows Store, kami menyarankan agar Anda tidak membuat implementasi IStringable Anda sendiri. Menerapkan IStringable dapat mengakibatkan perilaku yang tidak diinginkan saat memanggil ToString dari Windows Runtime, C++/CX, atau JavaScript.
Jika Anda memilih untuk menerapkan IStringable dalam tipe terkelola publik yang diekspor dalam komponen Windows Runtime, pembatasan berikut berlaku:
Anda dapat menentukan antarmuka IStringable hanya dalam relasi "kelas implements", sebagai berikut:
public class NewClass : IStringablePublic Class NewClass : Implements IStringableAnda tidak dapat menerapkan IStringable pada antarmuka.
Anda tidak dapat menyatakan parameter berjenis IStringable.
IStringable tidak dapat menjadi tipe pengembalian dari metode, properti, atau variabel.
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 dapat menyembunyikan implementasi
ToStringhanya dengan memanggilnya pada instans kelas yang bertipe kuat.
Dalam berbagai kondisi, panggilan dari kode asli ke tipe yang dikelola yang mengimplementasikan IStringable atau menyembunyikan implementasi ToString dapat menghasilkan perilaku yang tidak terduga.