Різниця між Convert.ToString () та .ToString ()


158

У чому різниця між Convert.ToString()і .ToString()?

Я знайшов багато відмінностей в Інтернеті, але яка головна різниця?


7
Ви кажете, що у вас є багато відмінностей в Інтернеті, а пізніше ви запитуєте, чи це лише з цієї конкретної причини? Що ще ви знайшли в Інтернеті?
Райан

3
Convert.ToString () має перевантаження, що дозволяє використовувати CultureInfo, тоді як .ToString () не має такого перевантаження.
Артемікс

Відповіді:


232

Convert.ToString()ручки null, поки ToString()ні.


3
добре .. З цієї конкретної причини користуються лише вони. два методи?
TinTin

Крім того , частково пов'язані см цю відповідь більш докладно: stackoverflow.com/questions/496096 / ...
JYelton

Більше інформації про відмінності за допомогою JustDecompile / Reflector: kodefuguru.com/post/2011/06/14/…
Ubikuity

5
Ви хочете nullповернути порожній рядок або викинути виняток? Це схоже на різницю між кастингом та використанням as: мовчазне перетворення.
styfle

@Ubikuity: посилання розірвано
hdoghmen

64

Виклик ToString()об'єкта передбачає, що об'єкт не є нульовим (оскільки для виклику методу екземпляра на ньому потрібно існувати об'єкт). Convert.ToString(obj)не потрібно вважати, що об'єкт не є null (так як це статичний метод для класу Convert), але натомість повернеться, String.Emptyякщо він є null.


var arg = Request.Params.Get ("__ EVENTARGUMENT"); рядок _arg = Convert.ToString (arg); _arg не відновлює String.Estpty, коли arg є нульовим. чому?
vml19

2
@Nilaa Ви можете відкрити ще одне запитання, замість того, щоб прокоментувати. Моє перше запитання, що робить його повернутися , коли аргумент є недійсним? Моя перша думка полягає в тому, що "arg" насправді вже має тип "string", тому ви викликаєте перевантаження Convert.ToString (...), що просто повертає те, що ви передаєте йому. Ця дискусія стосується перенавантаження методу "об'єктом".
Кріс Дуайер

4
@Roshe Так, я просто зачепився цим. Convert.ToString(string value)повертається, nullякщо аргумент є null. Convert.ToString(object value)повертається, String.Emptyякщо аргумент є null.
Тім Гудман

22

На додаток до інших відповідей щодо обробки nullзначень, Convert.ToStringнамагається використовувати IFormattableта IConvertibleінтерфейси перед викликом бази Object.ToString.

Приклад:

class FormattableType : IFormattable
{
    private double value = 0.42;

    public string ToString(string format, IFormatProvider formatProvider)
    {
        if (formatProvider == null)
        {
            // ... using some IOC-containers
            // ... or using CultureInfo.CurrentCulture / Thread.CurrentThread.CurrentCulture
            formatProvider = CultureInfo.InvariantCulture;
        }

        // ... doing things with format
        return value.ToString(formatProvider);
    }

    public override string ToString()
    {
        return value.ToString();
    }
}

Результат:

Convert.ToString(new FormattableType()); // 0.42
new FormattableType().ToString();        // 0,42

1
Це слід додати до правильної відповіді, оскільки це досить важлива інформація.
Сантос

2
Так само як доповнення - базуючись на довідковому джерелі, IConvertible має перевагу над тим IFormattable, що, в свою чергу, має перевагу над Object.ToString()реалізацією.
Grx70

11

Розберемо різницю на цьому прикладі:

int i= 0;
MessageBox.Show(i.ToString());
MessageBox.Show(Convert.ToString(i));

Ми можемо конвертувати ціле число iза допомогою i.ToString ()або Convert.ToString. То яка різниця?

Основна відмінність між ними - Convertфункція обробляє NULLS, а її i.ToString ()немає; це призведе до помилки виключення посилання NULL. Так як хороша практика кодування convertзавжди безпечна.


11
Ви, наприклад, трохи недійсні, оскільки int ніколи не може бути нульовим
MikeT

6

Ви можете створити клас і замінити toStringметод, щоб зробити все, що завгодно.

Наприклад - ви можете створити клас "MyMail" і замінити toStringметод надсилання електронної пошти або зробити якусь іншу операцію замість написання поточного об'єкта.

Convert.toStringПеретворює вказане значення в еквівалентну йому строкове представлення.


2
Convert.ToString насправді безпечний метод, який перевіряє на null, а якщо значення не є null, він просто викликає метод ToString на ньому. Тож у будь-якому випадку, якщо ви перекрили метод ToString, ваш метод переопределення ToString буде викликаний.
ZafarYousafi

І ця нульова безпека допомагає лише в тому випадку, якщо ви маєте справу з класами. Типи значень не можуть бути нульовими, тому ми можемо сміливо викликати метод ToString на них.
ZafarYousafi

5
object o=null;
string s;
s=o.toString();
//returns a null reference exception for string  s.

string str=convert.tostring(o);
//returns an empty string for string str and does not throw an exception.,it's 
//better to use convert.tostring() for good coding

4

Методи "в основному" однакові, за винятком обробки нуля .

Pen pen = null; 
Convert.ToString(pen); // No exception thrown
pen.ToString(); // Throws NullReferenceException

Від MSDN:
Convert.ToString метод

Перетворює вказане значення в його еквівалентне подання рядків.

Object.ToString

Повертає рядок, що представляє поточний об'єкт.


"нічого не друкує"? що нічого? null, ""або "null"?
weston

3

В Convert.ToString(), конвертувати обробляє або NULLзначення, або ні, але в .ToString()ньому не обробляється NULLзначення та NULLпомилка виключення посилань. Так що це в належній практиці використовувати Convert.ToString().


3

Для любителів Кодексу це найкраща відповідь.

    .............. Un Safe code ...................................
    Try
        ' In this code we will get  "Object reference not set to an instance of an object." exception
        Dim a As Object
        a = Nothing
        a.ToString()
    Catch ex As NullReferenceException
        Response.Write(ex.Message)
    End Try


    '............... it is a safe code..............................
    Dim b As Object
    b = Nothing
    Convert.ToString(b)

1
Я дуже задоволений вашою відповіддю. Звідси +1. Дякую.
Ашок кумар

3

Я згоден з відповіддю @ Райана . До речі, починаючи з C # 6.0 для цієї мети ви можете використовувати:

someString?.ToString() ?? string.Empty;

або

$"{someString}"; // I do not recommend this approach, although this is the most concise option.

замість

Convert.ToString(someString);

2

ToString()не може обробляти нульові значення та convert.ToString()може обробляти значення, які є нульовими, тому коли ви хочете, щоб ваша система обробляла нульове значення convert.ToString().


2

Convert.ToString(strName)буде обробляти нульові значення та strName.Tostring()не оброблятиме нульове значення та кидатиме виняток.

Так що краще використовувати Convert.ToString()тоді.ToString();


2
ToString() Vs Convert.ToString()

Подібність: -

Обидва використовуються для перетворення конкретного типу в рядок, тобто int в рядок, float в string або об'єкт в string.

Різниця: -

ToString()не може обробити null, якщо у випадку з Convert.ToString()буде обробляти нульове значення.

Приклад:

namespace Marcus
{
    class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    class Startup
    {
        public static void Main()
        {
            Employee e = new Employee();
            e = null;

            string s = e.ToString(); // This will throw an null exception
            s = Convert.ToString(e); // This will throw null exception but it will be automatically handled by Convert.ToString() and exception will not be shown on command window.
        }
    }
}

Convert.ToStringне впорайтеся Null Exception. це просто зробити:return value == null ? string.Empty : value.ToString()
Фабіо

0

Для розуміння обох методів візьмемо приклад:

int i =0;
MessageBox.Show(i.ToString());
MessageBox.Show(Convert.ToString(i)); 

Тут обидва методи використовуються для перетворення рядка, але основна відмінність між ними полягає в тому, що Convertфункціональні ручки NULL, а i.ToString()хіба це не викине NULL reference exception error.так, як хороша практика кодування з використанням convertзавжди безпечна.

Подивимось ще один приклад:

string s;
object o = null;
s = o.ToString(); 
//returns a null reference exception for s. 

string s;
object o = null;
s = Convert.ToString(o); 
//returns an empty string for s and does not throw an exception.

0

Convert.ToString(value)спочатку намагається закинути obj на IConvertible , потім IFormattable, щоб викликати відповідні ToString(...)методи. Якщо замість цього значення значення було nullповернути string.Empty. В крайньому випадку повертайтеся, obj.ToString()якщо нічого іншого не вийшло.

Варто зазначити, що Convert.ToString(value) може повернутися, nullякщо, наприклад, value.ToString()поверне null.

Дивіться .Net довідкове джерело


0

Я написав цей код і скомпілював його.

class Program
{
    static void Main(string[] args)
    {
        int a = 1;
        Console.WriteLine(a.ToString());
        Console.WriteLine(Convert.ToString(a));
    }
}

використовуючи 'зворотну інженерію' ( ilspy ), я з’ясовую 'object.ToString ()' і 'Convert.ToString (obj)' роблю саме одне. infact 'Convert.ToString (obj)' call 'object.ToString ()' so 'object.ToString ()' швидше.

Метод Object.ToString :

class System.Object
{
    public string ToString(IFormatProvider provider)
    {
        return Number.FormatInt32(this, null, NumberFormatInfo.GetInstance(provider));
    }
}

Метод Conver.ToString :

class System.Convert
{
    public static string ToString(object value)
    {
        return value.ToString(CultureInfo.CurrentCulture);
    }
}

0

У C #, якщо ви оголошуєте змінну рядка, і якщо ви не присвоюєте їй ніякого значення, то за замовчуванням ця змінна приймає нульове значення. У такому випадку, якщо ви використовуєте метод ToString (), ваша програма викине нульове посилання виключення. З іншого боку, якщо ви використовуєте метод Convert.ToString (), ваша програма не викине виключення.


0
  • Convert.Tostring() в основному просто називає наступне value == null ? String.Empty: value.ToString()

  • (string)variableпередаватиметься лише тоді, коли є неявний або явний оператор щодо того, що ви передаваєте

  • ToString()може бути відмінено типом (він має контроль над тим, що він робить), якщо ні, це призводить до імені типу

Очевидно, що якщо об’єкт недійсний , ви не можете отримати доступ до члена екземпляра ToString(), це спричинить виняток


-1

Функція Convert.Tostring () обробляє NULL, тоді як метод .ToString () не робить. завітайте сюди .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.