Здравствуйте, Sinclair, Вы писали:
AV>>Часто встречается рекомендация использовать следующий код, если нужно использовать переменную a: S>А можно привести эту "часто встречающуюся рекомендацию", чтобы мы могли наконец найти ее автора и скормить его в garbage collector? S>Читать здесь
Господа, читающие эту ветку в rsdn.
Предлагаю вам почитать ее в gotdotnet.ru. Несмотря на то, что создана
тема была в rsdn, некоторые ответы почему-то здесь не отображаютя. По
сему поводу написал модераторам gotdotnet (как написать в rsdn не
нашел), но кроме пропадания на время всей ветки ничего не изменилось.
Кстати это не первый случай и, возможно, уже закономерность. Создавая
здесь (rsdn) тему, обязательно надо просматривать gotdotnet, т.к. там,
возможно есть ответы, а создавая тему в gotdotnet надо учитывать, что
в rsdn она, возможно, вообще не появится (такое у меня уже было).
Господа, модераторы. Скажите что-нибудь.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>В данной статье эта рекомендации кстати и не ставится под сомнение. Сравниваем два примера кода до просветления:
ВВ>
ВВ>A a = o as A;
ВВ>if (a != null)
ВВ> a.DoSomething();
ВВ>
ВВ>и
ВВ>
ВВ>(a as A).DoSomething();
ВВ>
И что всё-таки быстрее работает и лучше? Цифры после проведенного эксперимента есть?
Здравствуйте, Andrej-V, Вы писали:
AV>Чего-то непонятно: исключение будет если a не A.
А чего непонятного-то? Будет "плохой" NullReferenceException вместо "хорошего" InvalidCastException. NullReferenceException сам по себе не говорит что произошла ошибка при привидении. В данном примере это может и не так критично, но в некоторых случаях можно таким весьма неплохо запрятать реальную ошибку. Потом сиди и парься почему у тебя Null в метод передается — то ли действительно null, то ли ошибка привидения.
Здравствуйте, orange_, Вы писали:
_>И что всё-таки быстрее работает и лучше? Цифры после проведенного эксперимента есть?
Это:
A a = o as A;
if (a != null)
a.DoSomething();
работает быстрее чем:
A a2 = null;
if (a is A)
a2 = (A)a;
так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.
НО: В 99% разница между этими примерами кода настолько копеечная по скорости, что перестраиваться на метод с as-ом, когда привык писать через си-каст и is смысле никакого нет.
ВВ>A a = o as A;
ВВ>if (a != null)
ВВ> a.DoSomething();
ВВ>
ВВ>работает быстрее чем: ВВ>
ВВ>A a2 = null;
ВВ>if (a is A)
ВВ> a2 = (A)a;
ВВ>
ВВ>так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.
Это верно только, если результат a is A в большинстве случаев истинен. Если же проверять приходиться среди множества, из которых только, к примеру, один верный, то второй вариант уже будет предпочтительней.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, Andrej-V, Вы писали:
AV>>Чего-то непонятно: исключение будет если a не A.
ВВ>А чего непонятного-то? Будет "плохой" NullReferenceException вместо "хорошего" InvalidCastException. NullReferenceException сам по себе не говорит что произошла ошибка при привидении. В данном примере это может и не так критично, но в некоторых случаях можно таким весьма неплохо запрятать реальную ошибку. Потом сиди и парься почему у тебя Null в метод передается — то ли действительно null, то ли ошибка привидения.
1. Привидение это то, которое в простыне с вырезанными дырками.
2. Непонятно, как можно это использовать. Т.е. еще бы пару строк, а то пока похоже на вырезание гландов... сами знаете как.
Здравствуйте, Andrej-V, Вы писали:
AV>1. Привидение это то, которое в простыне с вырезанными дырками. AV>2. Непонятно, как можно это использовать. Т.е. еще бы пару строк, а то пока похоже на вырезание гландов... сами знаете как.
Здравствуйте, rameel, Вы писали:
R>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>
ВВ>>A a = o as A;
ВВ>>if (a != null)
ВВ>> a.DoSomething();
ВВ>>
ВВ>>работает быстрее чем: ВВ>>
ВВ>>A a2 = null;
ВВ>>if (a is A)
ВВ>> a2 = (A)a;
ВВ>>
ВВ>>так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.
R>Это верно только, если результат a is A в большинстве случаев истинен. Если же проверять приходиться среди множества, из которых только, к примеру, один верный, то второй вариант уже будет предпочтительней.
Не могли бы объяснить свое последнее предложение? Т.е. почему так?
Здравствуйте, Andrej-V, Вы писали:
AV>Не могли бы объяснить свое последнее предложение? Т.е. почему так?
...
так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.
Вот я и говорю, что эта двойная работа будет только, если результатом is будет чаще true. А вот если ожидается, что наоборот, да и в большинстве случаев, то is будет отрабатывать быстрее, чем as
Только вот разницу в скорости и в микроскоп бывает не разглядишь
... << RSDN@Home 1.2.0 alpha rev. 669>>
Всегда ли as быстрее is ?
От:
Аноним
Дата:
28.01.07 07:15
Оценка:
я обычно делаю конструкцию вида:
if (b as A != null)
{
...
}
если большой селект по типу тогда сначало получаю тип, потом его сравниваю
Type t = b.GetType();
if (t == typeof(A))
{..}
else if (...)
else if (...)
else if (...)
Nimnul, я ставил условие:
Часто встречается рекомендация использовать следующий код, если нужно использовать переменную a... В вашем коде она не создается и в этом случае непонятно почему не просто if(b is A){...}
А почему когда большой селект Вы на каждый тип, на совпадение с которым проверяется b, создаете объект Type (typeof(A)) вместо if(b is A){...}
Чего-то непонятно: на gotdot Ваш ответ есть, а на rsdn нет?
string[] str = new string[10];
Type t = str.GetType();
if (t == typeof(object[]))
{
}
else if (t == typeof(System.Array))
{
}
else if (t == typeof(string[]))
{
Console.WriteLine("i am here");
}
using System;
interface Interface
{
}
class ClassImplementor : Interface
{
}
class ClassImplementor2 : Interface
{
}
static class Program
{
static void Main()
{
Interface[] implementors = new Interface[] { new ClassImplementor(), new ClassImplementor2() };
for (int i = 0; i < implementors.Length; i++)
{
if (implementors[i].GetType() == typeof(Interface))
{
Console.WriteLine("eisernWolf sucker");
}
else
{
Console.WriteLine("You are sucker");
}
}
Console.ReadLine();
}
}
using System;
using System.Diagnostics;
interface Interface
{
}
class ClassImplementor : Interface
{
}
class ClassImplementor2 : Interface
{
}
static class Program
{
static void Main()
{
const int count = 10000000;
ClassImplementor c = new ClassImplementor();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
if (c is ClassImplementor)
{
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
if (c as ClassImplementor != null)
{
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
if (c.GetType() == typeof(ClassImplementor))
{
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
}
Ответы: 97 мс, 93 мс, 1070 мс
Ради 4 мс на таком количестве циклов вообще не вижу смысла париться. is и точка. А вот с typeof затык... И с твоей идиологией тоже