В Effective C#: 50 Specific Ways to Improve Your C# написано, что никогда не нужно определять статический метод Equals, поскольку статический Object.Equals и так делает то, что нужно, то есть проверяет аргументы на равенство null, и всегда можно использовать его.
Но разве при определении размерного типа не стоит определить статический Equals для тех языков, в которых отсутствует возможность использовать operator ==?
P. S. Книгу видел в магазине, Google-м не нашел, поэтому цитату привести не могу.
Re: static bool Equal
От:
Аноним
Дата:
02.03.07 09:15
Оценка:
Здравствуйте, igna, Вы писали:
I>В Effective C#: 50 Specific Ways to Improve Your C# написано, что никогда не нужно определять статический метод Equals, поскольку статический Object.Equals и так делает то, что нужно, то есть проверяет аргументы на равенство null, и всегда можно использовать его.
I>Но разве при определении размерного типа не стоит определить статический Equals для тех языков, в которых отсутствует возможность использовать operator ==?
I>P. S. Книгу видел в магазине, Google-м не нашел, поэтому цитату привести не могу.
Здравствуйте, igna, Вы писали:
I>Но разве при определении размерного типа не стоит определить статический Equals для тех языков, в которых отсутствует возможность использовать operator ==?
А чем Вас не устраивает экземплярный метод Equals для размерных типов?
Здравствуйте, igna, Вы писали:
N>>А чем Вас не устраивает экземплярный метод Equals для размерных типов? I>А чем он не устраивает того, кто определяет operator ==?
Здравствуйте, nikov, Вы писали:
N>Краткость и интуитивность записи?
В отсутствии в языке операторов запись Equals(obj1, obj2) может использоваться как более интуитивная нежели наше "объектно-ориентированное" obj1.Equals(obj2). Да, я знаю, C# потребует указания типа, то есть UserType.Equals(obj1, obj2), но язык без пользовательских операций может позаботится о том, чтобы такое указание было не нужно.
Почему я считаю форму obj1.Equals(obj2) недостаточно интуитивной? В частности потому, что она провоцирует написание программ, где a равно b, но b не равно a. А запись Eq(x, y) используется в математике наряду с x=y.
I>В Effective C#: 50 Specific Ways to Improve Your C# написано, что никогда не нужно определять статический метод Equals, ...
I>Но разве при определении размерного типа не стоит определить статический Equals для тех языков, в которых отсутствует возможность использовать operator ==?
Provide alternate signatures. Most languages do not support operator overloading. For this reason, it is a CLS requirement for all types that overload operators to include a secondary method with an appropriate domain-specific name that provides the equivalent functionality. It is a Common Language Specification (CLS) requirement to provide this secondary method. The following example is CLS-compliant.
public struct DateTime
{
public static TimeSpan operator -(DateTime t1, DateTime t2) { }
public static TimeSpan Subtract(DateTime t1, DateTime t2) { }
}
Здравствуйте, igna, Вы писали:
I>P. S. Книгу видел в магазине, Google-м не нашел, поэтому цитату привести не могу. Плохо искал5-ая ссылка. Только там зарегестрироваться надо.
Здравствуйте, Chardex, Вы писали:
C>Здравствуйте, Chardex, Вы писали:
C>Item 3: Prefer the is or as Operators to Casts C> Я всегда думал по-другому, что as надо оч. осторожно использовать, а там обратное рассказывается.
Это надо осторожно использовать, если ты не проверяешь is или результат as на неудачу . А если наоборот — то как раз нормально
Здравствуйте, Chardex, Вы писали:
C>Здравствуйте, igna, Вы писали:
I>>P. S. Книгу видел в магазине, Google-м не нашел, поэтому цитату привести не могу. C>Плохо искал5-ая ссылка. Только там зарегестрироваться надо.
Как там зарегистя??? У меня сплошные иероглифы....
Здравствуйте, FDSC, Вы писали:
FDS>Это надо осторожно использовать, если ты не проверяешь is или результат as на неудачу . А если наоборот — то как раз нормально
Не совсем понятно, что Вы имеете в виду. К книге-то приводятся эффективные методики, но оператор as не дает никакой эффективности(читай производительности) по сравнению с обычным downcast'ом, даже наоборот. Да и код в котором, все приведения делаются с помощью as становится нечитаемым.
((A as B).Method1 as C).Method2
Это пример из реального проекта Видимо, его автор тоже прочел что-то наподобие и стал бездумно везде использовать "эффективную методику"
Здравствуйте, ie, Вы писали:
ie>Здравствуйте, igna, Вы писали:
I>>P. S. Книгу видел в магазине, Google-м не нашел, поэтому цитату привести не могу.
ie>здесь
Здравствуйте, Alexey Ivanov, Вы писали:
AI>Здравствуйте, FDSC, Вы писали:
FDS>>Это надо осторожно использовать, если ты не проверяешь is или результат as на неудачу . А если наоборот — то как раз нормально
AI>Не совсем понятно, что Вы имеете в виду. К книге-то приводятся эффективные методики, но оператор as не дает никакой эффективности(читай производительности) по сравнению с обычным downcast'ом, даже наоборот. Да и код в котором, все приведения делаются с помощью as становится нечитаемым.
AI>
AI>((A as B).Method1 as C).Method2
AI>
AI>Это пример из реального проекта Видимо, его автор тоже прочел что-то наподобие и стал бездумно везде использовать "эффективную методику"
Насколько я понимаю, имеется ввиду, делать так:
B ab = A as B;
if (ab != null)
{
C abc = ab.Method1 as C;
if (abc != null)
{
abc.Method2;
}
}
Типа, не дожидаться исключения NullReferenceException, когда оно возможно.
А вообще, согласен с вами. Лично я даже не припомню, когда в последний раз as использовал... точно раньше, чем goto, а его я не использовал года 2...
Здравствуйте, FDSC, Вы писали:
FDS>Типа, не дожидаться исключения NullReferenceException, когда оно возможно.
IMHO, оператор as для приведения и проверки типа в одном месте, как замена is и последующему касту. Когда же я, например, использую прямой cast, тогда я знаю, что именно такой там должен быть тип, а не иной, и исключение здесь только поможет
FDS>А вообще, согласен с вами. Лично я даже не припомню, когда в последний раз as использовал... точно раньше, чем goto, а его я не использовал года 2...
Радует, что есть взаимопонимание, потому как рекомендуется использовать as вместо приведений и в MSDN FAQ, и на codeproject, что несколько беспокоит
А goto стоило забросить пораньше, об этом еще Страуструп писал в моей первой книге по C++ году эдак в 1998-99