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, чтобы исключить исключения нулевой ссылки (если, конечно, вы не хотите, чтобы в таких случаях было исключение).