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# atauFor Each...Next
konstruksi di Visual Basic.Jika kelas bukan
sealed
(dalam C#) atauNotInheritable
(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:- Terapkan konstruktor yang diperlukan. Kelas turunan tidak mewarisi konstruktor kelas dasar mereka.
- 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 jenisToString
asli. Anda harus memberikan beberapa nama lain untuk penggantian tanpaToString
parameter Anda.Contoh berikut mendefinisikan dua metode yang memperluas List<T> kelas: metode tanpa
ToString2
parameter, danToString
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.