Sự khác biệt giữa Convert.ToString () và .ToString ()


158

Sự khác biệt giữa Convert.ToString()và là .ToString()gì?

Tôi tìm thấy nhiều sự khác biệt trực tuyến, nhưng sự khác biệt chính là gì?


7
Bạn nói rằng bạn có nhiều sự khác biệt trên web và sau đó bạn hỏi nếu chỉ vì lý do cụ thể này? Bạn đã tìm thấy gì khác trên web?
Ryan

3
Convert.ToString () có tình trạng quá tải cho phép sử dụng CultureInfo, trong khi .ToString () không có tình trạng quá tải như vậy.
Artemix

Câu trả lời:


232

Convert.ToString()xử lý null, trong khi ToString()không.


3
tốt .. Vì lý do cụ thể này chỉ có họ sử dụng. Hai phương pháp?
TinTin

Ngoài ra, liên quan đến bán, xem câu trả lời này để biết thêm chi tiết: stackoverflow.com/questions/496096/
mẹo

Thông tin thêm về sự khác biệt khi sử dụng JustDecompile / Reflector: kodefuguru.com/post/2011/06/14/iêu
Ubikuity 17/212

5
Bạn có muốn nulltrả về một chuỗi rỗng hoặc ném một ngoại lệ? Nó giống như sự khác biệt giữa truyền và sử dụng as: chuyển đổi im lặng.
styfle

@Ubikuity: liên kết bị hỏng
hdoghmen

64

Gọi điện thoại ToString() một đối tượng giả định rằng đối tượng không phải là null (vì một đối tượng cần tồn tại để gọi một phương thức cá thể trên nó). Convert.ToString(obj)không cần phải giả định đối tượng không phải là null (vì nó là một phương thức tĩnh trên lớp Convert), nhưng thay vào đó sẽ trả về String.Emptynếu nó null.


var arg = Request.Params.Get ("__ EVENTARGUMENT"); chuỗi _arg = Convert.ToString (arg); _arg không giữ lại String.Empty khi arg là null. tại sao?
vml19

2
@Nilaa bạn có thể muốn mở một câu hỏi khác hỏi điều này, thay vì trong bình luận. Câu hỏi đầu tiên của tôi là gì không nó trở lại khi arg là null? Suy nghĩ đầu tiên của tôi là "arg" thực sự đã thuộc loại "chuỗi", vì vậy bạn đang gọi quá tải của Convert.ToString (...), chỉ trả về những gì bạn chuyển cho nó. Thảo luận này liên quan đến quá tải "đối tượng" của phương thức.
Chris Dwyer

4
@Roshe Vâng, tôi chỉ có một chút bởi điều này. Convert.ToString(string value)trả về nullnếu đối số là null. Convert.ToString(object value)trả về String.Emptynếu đối số là null.
Tim Goodman

22

Ngoài các câu trả lời khác về việc xử lý nullcác giá trị, hãy Convert.ToStringthử sử dụng IFormattableIConvertiblegiao diện trước khi gọi cơ sở Object.ToString.

Thí dụ:

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();
    }
}

Kết quả:

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

1
Điều này nên được thêm vào câu trả lời chính xác bởi vì nó là thông tin khá quan trọng.
Santhos

2
Cũng như một phần bổ sung - dựa trên nguồn tham chiếu IConvertible được ưu tiên hơn IFormattable, điều này sẽ được ưu tiên hơn so với Object.ToString()việc thực hiện.
Grx70

11

Hãy hiểu sự khác biệt thông qua ví dụ này:

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

Chúng ta có thể chuyển đổi số nguyên ibằng cách sử dụng i.ToString ()hoặcConvert.ToString . Vậy sự khác biệt là gì?

Sự khác biệt cơ bản giữa chúng là Convert hàm xử lý NULLS trong khi i.ToString ()không; nó sẽ đưa ra một lỗi ngoại lệ tham chiếu NULL. Vì vậy, như thực hành mã hóa tốt sử dụng convertluôn luôn an toàn.


11
ví dụ của bạn là một chút không hợp lệ vì int không bao giờ có thể là null
MikeT

6

Bạn có thể tạo một lớp và ghi đè lên toString phương thức để làm bất cứ điều gì bạn muốn.

Ví dụ: bạn có thể tạo một lớp "MyMail" và ghi đè lêntoString phương thức để gửi email hoặc thực hiện một số thao tác khác thay vì viết đối tượng hiện tại.

Việc Convert.toStringchuyển đổi giá trị được chỉ định thành biểu diễn chuỗi tương đương của nó.


2
Convert.ToString thực sự là một phương thức an toàn để kiểm tra null và nếu giá trị không null, nó chỉ đơn giản gọi phương thức ToString trên đó. Vì vậy, trong mọi trường hợp, nếu bạn đã ghi đè phương thức ToString, phương thức ToString overriden của bạn sẽ được gọi.
ZafarYousafi

Và sự an toàn null này chỉ có ích nếu bạn đang làm việc với các lớp. Các loại giá trị không thể là null và vì vậy chúng ta có thể gọi phương thức ToString một cách an toàn trên chúng.
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

Các phương thức "về cơ bản" giống nhau, ngoại trừ xử lý null .

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

Từ MSDN:
Convert.ToString Phương thức

Chuyển đổi giá trị được chỉ định thành biểu diễn chuỗi tương đương của nó.

Object.ToString

Trả về một chuỗi đại diện cho các đối tượng hiện tại.


"Không in gì"? không có gì null, ""Hoặc "null"?
weston

3

Trong Convert.ToString(), Convert xử lý một NULLgiá trị hoặc không nhưng trong .ToString()đó không xử lý một NULLgiá trị và NULLlỗi ngoại lệ tham chiếu. Vì vậy, nó là trong thực hành tốt để sử dụng Convert.ToString().


3

Đối với những người yêu thích Code đây là câu trả lời tốt nhất.

    .............. 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
Tôi khá hài lòng với câu trả lời của bạn. Do đó +1. Cảm ơn bạn.
Ashok kumar

3

Tôi đồng ý với câu trả lời của @ Ryan . Nhân tiện, bắt đầu với C # 6.0 cho mục đích này, bạn có thể sử dụng:

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

hoặc là

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

thay vì

Convert.ToString(someString);

2

ToString()không thể xử lý các giá trị null và convert.ToString()có thể xử lý các giá trị null, vì vậy khi bạn muốn hệ thống của mình xử lý việc sử dụng giá trị null convert.ToString().


2

Convert.ToString(strName)sẽ xử lý các giá trị null và strName.Tostring()sẽ không xử lý giá trị null và đưa ra một ngoại lệ.

Vì vậy, tốt hơn là sử dụng Convert.ToString()sau đó.ToString();


2
ToString() Vs Convert.ToString()

Điểm tương đồng :-

Cả hai đều được sử dụng để chuyển đổi một loại cụ thể thành chuỗi, ví dụ int thành chuỗi, float thành chuỗi hoặc một đối tượng thành chuỗi.

Sự khác biệt :-

ToString()không thể xử lý null trong khi trong trường hợp với Convert.ToString()sẽ xử lý giá trị null.

Thí dụ :

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.ToStringkhông xử lý Null Exception. nó chỉ đơn giản là làm:return value == null ? string.Empty : value.ToString()
Fabio

0

Để hiểu cả hai phương pháp, hãy lấy một ví dụ:

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

Ở đây cả hai phương thức đều được sử dụng để chuyển đổi chuỗi nhưng sự khác biệt cơ bản giữa chúng là: Convertxử lý hàm NULL, trong khi i.ToString()nó sẽ không ném NULL reference exception error.như vậy vì thực hành mã hóa tốt sử dụng convertluôn an toàn.

Hãy xem một ví dụ khác:

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)đầu tiên thử truyền obj sang IConvertible , sau đó IFormattable để gọi ToString(...)các phương thức tương ứng . Nếu thay vào đó, giá trị tham số được nulltrả về string.Empty. Như một phương sách cuối cùng, trở vềobj.ToString() nếu không có gì khác làm việc.

Đáng chú ý là Convert.ToString(value) có thể trả về nullnếu ví dụ value.ToString()trả về null.

Xem nguồn tham khảo .Net


0

tôi đã viết mã này và biên dịch nó.

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

bằng cách sử dụng 'kỹ thuật đảo ngược' ( ilspy ) tôi tìm ra 'object.ToString ()' và 'Convert.ToString (obj)' thực hiện chính xác một điều. infact 'Convert.ToString (obj)' gọi 'object.ToString ()' so 'object.ToString ()' nhanh hơn.

Phương thức Object.ToString :

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

Phương thức Conver.ToString :

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

0

Trong C # nếu bạn khai báo một biến chuỗi và nếu bạn không gán bất kỳ giá trị nào cho biến đó, thì theo mặc định, biến đó sẽ nhận một giá trị null. Trong trường hợp như vậy, nếu bạn sử dụng phương thức ToString () thì chương trình của bạn sẽ đưa ra ngoại lệ tham chiếu null. Mặt khác, nếu bạn sử dụng phương thức Convert.ToString () thì chương trình của bạn sẽ không ném ngoại lệ.


0
  • Convert.Tostring() về cơ bản chỉ cần gọi như sau value == null ? String.Empty: value.ToString()

  • (string)variablesẽ chỉ truyền khi có một toán tử ẩn hoặc tường minh về những gì bạn đang truyền

  • ToString()có thể được ghi đè theo loại (nó có quyền kiểm soát những gì nó làm), nếu không nó sẽ dẫn đến tên của loại

Rõ ràng nếu một đối tượng là null , bạn không thể truy cập thành viên thể hiện ToString(), nó sẽ gây ra ngoại lệ


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.