Кастинг по сравнению с Преобразованием объекта toString, когда объект действительно является строкой

Да, подчеркивания могут использоваться где угодно в идентификаторе. Я полагаю, что правила: любой из a-z, A-Z, _ в первом символе и тех + 0-9 для следующих символов.

префиксы Подчеркивания распространены в коде C - одинарное подчеркивание означает, что "частные", и двойные подчеркивания обычно резервируются для использования компилятором.

70
задан David Božjak 23 July 2009 в 09:58
поделиться

8 ответов

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

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

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

51
ответ дан 24 November 2019 в 13:28
поделиться

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

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

1
ответ дан 24 November 2019 в 13:28
поделиться

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

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.    
}
3
ответ дан 24 November 2019 в 13:28
поделиться

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

5
ответ дан 24 November 2019 в 13:28
поделиться

Если вы знаете, что это Строка , то непременно преобразуйте ее в Строку . Приведение вашего объекта будет быстрее, чем вызов виртуального метода.

Изменить: Вот результаты некоторых тестов:

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

Я использовал 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 () .

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

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

public override string ToString()
{
    return this;
}
16
ответ дан 24 November 2019 в 13:28
поделиться

В данном случае:

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

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

return this;

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

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

2
ответ дан 24 November 2019 в 13:28
поделиться

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

Изменить: Вот результаты некоторых тестов:

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

Я использовал 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 () .

30
ответ дан 24 November 2019 в 13:28
поделиться

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

Если вы собираетесь использовать приведение: строка name = (строка) DataRowObject ["имя"] вы получите Exception: Unable to cast object of type 'System.DBNull' to type'System.String ', если запись в таблице базы данных имеет нулевое значение.

В этом сценарии вы должны использовать: имя строки = 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";

}
5
ответ дан 24 November 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: