Casting vs Преобразование объекта toString, когда объект действительно является строкой

Это не проблема, но мне любопытно. Когда я сохраняю строку в let, скажем, DataRow, она передается объекту. Когда я хочу использовать его, я должен использовать его ToString. Насколько я знаю, есть несколько способов сделать это, сначала

string name = (string)DataRowObject["name"]; //valid since I know it a string

а другой:

string name = DataRowObject["name"].ToString();

Меня интересует, в чем разница между ними? Является ли первый более эффективным? (Это всего лишь предположение, в моей голове метод ToString() реализован каким-то механизмом цикла, в котором только "литье" "может" быть быстрее, однако это просто "ощущение кишки", которое у меня есть).

Есть ли еще более быстрый/более элегантный способ сделать это?

Может ли кто-нибудь прояснить это для меня?

Ответ 1

Оба предназначены для разных цели. Метод ToString любого объект должен возвращать строку представление этого объекта. Кастинг совсем другое, а ключ "как" слово выполняет условное литье, так как было сказано. "Как" ключевое слово в основном говорит: "Получите мне ссылку этот тип к этому объекту, если это объект - это тип" while ToString говорит: "Получите строковое представление этого объекта". Результатом может быть в некоторых случаях, но никогда не считаются взаимозаменяемыми потому что, как я уже сказал, они существуют для разные цели. Если ваше намерение это бросить, тогда вы всегда должны использовать cast, NOT ToString.

из http://www.codeguru.com/forum/showthread.php?t=443873

см. также http://bytes.com/groups/net-c/225365-tostring-string-cast

Ответ 2

Если вы знаете, что это String, то, в любом случае, отбросить его на String. Кастинг вашего объекта будет быстрее, чем вызов виртуального метода.

Изменить: Ниже приведены результаты некоторого бенчмаркинга:

============ Casting vs. virtual method ============
cast 29.884 1.00
tos  33.734 1.13

Я использовал Jon Skeet BenchmarkHelper следующим образом:

using System;
using BenchmarkHelper;

class Program
{
    static void Main()
    {
        Object input = "Foo";
        String output = "Foo";

        var results 
           = TestSuite.Create("Casting vs. virtual method", input, output)
            .Add(cast)
            .Add(tos)
            .RunTests()
            .ScaleByBest(ScalingMode.VaryDuration);

        results.Display(ResultColumns.NameAndDuration | ResultColumns.Score,
                results.FindBest());
    }

    static String cast(Object o)
    {
        return (String)o;
    }

    static String tos(Object o)
    {
        return o.ToString();
    }
}

Итак, похоже, что кастинг на самом деле немного быстрее, чем вызов ToString().

Ответ 3

В основном в вашем случае лучше оставить тип, потому что .ToString() может скрыть ошибки. Например, ваша схема базы данных изменилась, и имя больше не имеет тип строки, но с .ToString() ваш код все еще работает. Поэтому в этом случае лучше использовать тип cast.

Вот реализация String.ToString() - ничего особенного =)

public override string ToString()
{
    return this;
}

Ответ 4

Downcasting - относительно медленная операция, так как CLR должен выполнять различные проверки типа времени выполнения. Однако в этом конкретном сценарии литье в string более уместно, чем вызов ToString() для согласованности (вы не можете вызвать ToInt32 на object, но отбросите его до int) и maintanability.

Ответ 5

Я хочу сделать еще один комментарий

Если вы собираетесь использовать casting: string name = (string) DataRowObject [ "name" ] вы получите исключение: невозможно лить объект типа "System.DBNull" на type'System.String в случае, если запись в таблице базы данных имеет нулевое значение.

В этом сценарии вы должны использовать: string name = DataRowObject [ "name" ]. ToString() или

Вы должны проверить нулевое значение, например

if(!string.IsNullOrEmpty(DataRowObject["name"].ToString()))
{
string name = (string)DataRowObject["name"];
}
else
{
//i.e Write error to the log file
string error = "The database table has a null value";

}

Ответ 6

В этом случае:

string name = DataRowObject["name"].ToString();

так как это string, я думаю, что метод ToString() строкового объекта прост как:

return this;

поэтому ИМХО нет штрафа за производительность.

PS Я программист на Java, поэтому этот anwser - это только предположение.

Ответ 7

Для объекта данных я предлагаю вам использовать ключевое слово "как", например, следующий код.

string name = DataRowObject["name"] as string;

Пожалуйста, проверьте его, прежде чем использовать значение.

if(name != null)
{
    // statement for empty string or it has value
}
else
{
    // statement for no data in this object.    
}

Ответ 8

ToString() не выполняет бросок по умолчанию. Его цель - вернуть строку, представляющую тип (например, "System.Object" ).

Если вы хотите избежать кастинга, вы можете попытаться подумать о реализации, которая строго типизирована (например, с использованием дженериков) и вообще избегает DataRowObject.

Ответ 9

Я знаю, что вы упомянули, что Object является строкой, но если вы опасаетесь, что возвращаемый объект имеет значение null, вы также можете использовать команду "Convert.ToString(DataRowObject [" name "]); Это дает дополнительное преимущество при возврате пустой строки (string.empty), если объект имеет значение NULL, чтобы исключить исключения нулевой ссылки (если, конечно, вы не хотите, чтобы в таких случаях было исключение).