Си диез / Говнокод #16598 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
public static class GlobalFunc
{
	// bla-bla-bla ...
 
	public static bool isDouble(string input)
	{
		Double dec;
		return Double.TryParse(input, out dec);
	}

	public static bool isUShort(string input)
	{
		ushort dec;
		return ushort.TryParse(input, out dec);
	}

	public static bool isShort(string input)
	{
		short dec;
		return short.TryParse(input, out dec);
	}

	public static bool IsDate(string input)
	{
		DateTime date;
		return DateTime.TryParse(input, out date);
	}
}

face palm

Запостил: Smekalisty Smekalisty, (Updated )

Комментарии (16) RSS

  • Вероятно стоило только Nullable<T> отдавать, а не Boolean, если код не наследие .NET 2.0.

    Ну и пнуть Enum.Parse на всякий случай:
    public static TEnum? ToEnum<TEnum>(String s) where TEnum : struct
    {
    	TEnum dummy;
    	return Enum.TryParse<TEnum>(s, out dummy) && Enum.IsDefined(typeof(TEnum), dummy) ? dummy : (TEnum?)null;
    }


    А дабы не дропнуть производительность на рефлексии, засунуть все енумы в Hashtable для текущего домена:
    public abstract class Enum { private static Hashtable fieldInfoHash = Hashtable.Synchronized(new Hashtable()); }
    Ответить
    • Дык не проканает с вельютайпами. Только с енумами.
      Ответить
      • От первоисточника не сильно отличается:
        http://referencesource.microsoft.com/#mscorlib/system/enum.cs#372

        Поэтому и приходится ещё и Enum.IsDefined использовать, чтобы вот на такое говно не нарваться:
        enum TestEnum { Undefined=0, A1=1, A2=2, };
        static void Main(String[] args) {
            TestEnum dummy=Enum.TryParse<TestEnum>("3",out dummy)?dummy:TestEnum.Undefined;
            System.Diagnistics.Debug.Assert(dummy==TestEnum.Undefined);
        }


        Либо использовать более шустрый вариант, но с затруднениями с дальнейшим развитием:
        TestEnum dummy=Enum.TryParse<TestEnum>("3",out dummy)?dummy:TestEnum.Undefined;
        if(dummy<TestEnum.Undefined || dummy>TestEnum.A2)
            dummy=TestEnum.Undefined;
        Ответить
        • я не совсем понял об чем мы. я о вельютайпах, а ты об енумах...
          Ответить
          • А чем ещё предлагаешь ограничивать енумы передаваемые в генерик?
            Ответить
              • А-а, понял.
                В таком случае, лучше заранее построить словарик с MemberInfo по каждому методу Parse, дабы каждый раз не искать его через рефлексию.

                Да и Parse выбросит исключение, а не успех операции, как это происходит у ТС.

                Тут ещё пришла идейка унификации такой фигни:
                String arr="1,2,3,4,5,Печенька,6,7,8,,9";


                Т.е. стандартный подход выглядит так (Специально Value и explicit cast в лямбде сделал):
                class NullableParse {
                static Int32? ToInt32(String s)
                {
                    Int32 result;
                    return Int32.TryParse(s,out result)?result:(Int32?)null;
                }
                }
                Int32[] result = arr.Split(new Char[] {',',},StringSplitOptions.RemoveEmptyEntries).Select(p=>NullableParse.ToInt32(p)).Where(p=>p!=null).Select(p=>(Int32)p).ToArray();


                Тут есть 2 проблемы:
                1) String.Split возвращает сразу Array (Код внутри особыми изысками не отличается)
                2) Код сложно загнать под генерики. Т.к. либо использование рефлексии, либо городить отдельный статик метод с "if(Type) {}".

                ... Хотя, на вскидку, вроде всё более-менее сходится...
                Надо будет завтра попробовать на производительность потестировать...
                Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8