- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
public static bool GetSafeBool(object val, bool defaultVal)
{
//TODO: check functionality
bool result = defaultVal;
try
{
if (val != null)
{
string str = val.ToString().Trim();
// compare ignore case, for performance
result = (0 == string.Compare(str, true.ToString(), true) || str == "1" || str == "-1");
}
}
catch { }
return result;
}
3.14159265 27.09.2011 13:29 # −4
со всех сторон.
sayidandrtfm 27.09.2011 14:14 # −2
3.14159265 27.09.2011 14:19 # 0
если и смотреть - то сюда
http://msdn.microsoft.com/en-us/library/system.boolean.parse.aspx
особенно вот:
' Cannot parse '0'.
' Cannot parse '1'.
' Cannot parse '-1'.
числа парсить оно не умеет, а кому-то было нужно чтоб умел.
sayidandrtfm 27.09.2011 15:01 # 0
Object i = 0;
System.Type type = typeof(i);
if( type.FullName == …
А что делать с -1, 0, 3, 9, 11,22,- 22 или с другим типом — дело то не хитрое...
3.14159265 27.09.2011 15:25 # 0
это хорошо.
тут же наверняка придется проверять каждый тип.
if( type.FullName == "byte")
if (i=-1)
...
else if( type.FullName == "int")
if (i=-1)
...
else if( type.FullName == "long")
if (i=-1)
...
else if( type.FullName == "string")
if (i="-1")
...
это попахивает http://govnokod.ru/7905,но там такой подход более-менее обоснован
sayidandrtfm 27.09.2011 16:04 # 0
она обязательна и очевидна. Не будем беспокоить кэпа, хотя бы в этом посте.
Во-первых: это сегодня может быть только int, а завтра,
из-за расположение звёзд, как минимум, уже нужен будет string или ...
>тут же наверняка придется проверять каждый тип.
Во-вторых: Разве при приведении типов int,float,double - все нулевые значения - false, а не нулевые - true, нет?
Empty string- false, ЕМНИП.
В-третьих: если уж на то пошло, то http://ru.wikipedia.org/wiki/Теория_множеств
По #7905: а каким value НЕ может быть?
Просто проверить на принадлежность к множеству, как вариант http://govnokod.ru/7905#comment108428
P.S. Странно, довольно частая операция и можно было реализовать некое решение,
например, метод IsValSystemType, а может и есть уже...
3.14159265 27.09.2011 16:36 # 0
согласен. это тут плохо.
>Разве при приведении типов int,float,double - все нулевые значения - false, а не нулевые - true, нет?
наверняка раз проверки написаны, значит так было нужно.
я бы в этой ситуации конечно наваял что-то такое.
3.14159265 27.09.2011 16:46 # 0
if (String.Empty!=s)
return (0 == string.Compare(str, "true", true) || !"0" .equals(str))
*самофикс
sayidandrtfm 27.09.2011 17:54 # 0
absolut 27.09.2011 18:04 # +1
<обобщённые>
wvxvw 28.09.2011 13:33 # 0
Но если это был какой-то принципиально новый текстовый формат сериализавии данных (для которого в .NET не нашлось энкодера / декодера), то все равно, нормально было бы:
вместо вообще всей этой функции.
gegMOPO4 28.09.2011 17:41 # 0
wvxvw 28.09.2011 18:33 # 0
gegMOPO4 28.09.2011 18:50 # 0
bugmenot 28.09.2011 19:11 # 0
wvxvw 28.09.2011 18:40 # 0
gegMOPO4 28.09.2011 18:53 # 0
Кстати, его код работает и если val — булевское.
wvxvw 28.09.2011 19:54 # 0
По поводу "true" - нет, если быть дотошным, то у автора получалось сравнивать с Boolean.TrueString, но это мелочи, т.как не понятно действительно ли это было нужно, или это была ошибка. Поэтому я и говорю, что не понятно, где остановиться. Нужно знать зачем автор это делал. Но, в любом случае код плохой, т.как если автор хотел проверить, что значение принадлежит к какому-то множеству, то последовательно сравнивать с каждым членом множества - говнокод (т.как повторение одного и того же). Но еще и кажется, что автор пытался принадлежность к множеству доказать через то, что значение не принадлежит к другому множеству disjoint (к сожалению не знаю, как по-русски) с нужным множеством, которое еще и бесконечно.
SmackMyBitchUp 28.09.2011 19:59 # +1
gegMOPO4 29.09.2011 12:04 # +1
1) разбирать, разрезать на части, расчленять;
2) вывихнуть.
Есть множество значений значений, соответствующий true, есть множество значений значений, соответствующий false, но есть и множество значений, не соответствующих ни true, ни false. Как реагировать на них, считать их true, false, третьим значением (null) или выбрасывать исключение — это предпочтения автора.
Но по крайней мере для булевского значения код ведёт себя ожидаемо.
wvxvw 29.09.2011 12:27 # 0
В теории множеств одно множество disjoint с другим когда известно, что нет ни одного элемента присутствующего в обоих множествах.
Именно по-этому я и говорил про ECMA - для них (в отличие от типичного для Java, например, взгляда на мир :) нет характерно считать что boolean возможны трех видов, ложь, истина и ни то и ни другое.
gegMOPO4 29.09.2011 12:47 # 0
roman-kashitsyn 29.09.2011 13:43 # 0
в ECMAScript есть такие же обёртки для примитивных типов, как и в Java. Там они даже интересней:
wvxvw 29.09.2011 12:35 # 0
Но тут опять же надо искать автора и узнать зачем он это сделал, потому что результат получился очень странный. Скорее всего, что именно результат не правильный.
gegMOPO4 29.09.2011 12:49 # 0
wvxvw 29.09.2011 13:09 # 0
Что до оригинальной функции - повторюсь. Она делает что-то странное. Скорее всего она не должна делать то, что делает, и повторять ее не нужно. И это потому, что в идеале, опять же, множество ложных должно содержать всего один элемент, но если мы туда добавим произвольное количество других элементов, то с каждым добавленым элементом мы так же добавляем исключение из правила, абсолютно безосновательно.
Есть такой похожий boolean со знаком вопроса - вот там может быть не ложь и не истина, а в таком вот - не может.
gegMOPO4 29.09.2011 13:30 # +1
Как это не существуют? Красный мяч, 5 сентября 1970 года, «Манифест коммунистической партии» — это истина или ложь? Существуют значения и помимо boolean.
absolut 29.09.2011 14:19 # 0
gegMOPO4 29.09.2011 18:45 # +3
absolut 29.09.2011 21:29 # 0
Интересно, сколько народу полезло в календарь смотреть :)
bugmenot 29.09.2011 22:02 # 0
wvxvw 29.09.2011 15:06 # 0
Что делает код который мы обсуждаем: он смешивает правила перевода типов для C# с правилами чтения типа из одного контекста в другой. Этого изначально делать не нужно было. Поэтому я и говорю, что то, что делает функция скорее всего просто не правильно. (практичность и полезнозность этого типа не имеет отношения к обсуждению).
gegMOPO4 29.09.2011 18:49 # 0
Кстати, в третий или четвёртый раз намекаю вам — что сделает ваш код с val равным false?
wvxvw 28.09.2011 13:43 # +1
absolut 27.09.2011 14:16 # +2
А также значений 1/-1 как истины.
wvxvw 27.09.2011 14:08 # −2
fade 27.09.2011 14:25 # 0
Я это нашел в классе Utils на полторы тыщи строк приложения, которое уже около года худо-бедно работает в продакшне.
guest 27.09.2011 14:47 # +2
alexoy 27.09.2011 14:56 # −6
AxisPod 28.09.2011 06:39 # 0
guest8 09.04.2019 11:36 # −999