String.IsNullOrEmpty
46 отговора
1078 прегледа
Re: Уточнение за низовете в C++
(offtopic)
колкото до exceptions, едва ли си можел да гарантираш, че кода дето си го писал е exceptio safe, че всичкия стар код дето си ползвал е е.с., че всички с които работиш знаят въобще за какво става дума, за това че допреди VC6 не беше ясно ако се хвърли ексепшън от конструктор и динамична памет кво става,..
колкото до exceptions, едва ли си можел да гарантираш, че кода дето си го писал е exceptio safe, че всичкия стар код дето си ползвал е е.с., че всички с които работиш знаят въобще за какво става дума, за това че допреди VC6 не беше ясно ако се хвърли ексепшън от конструктор и динамична памет кво става,..
Re: Уточнение за низовете в C++
На мен вторият вариант ми изглежда по-естествен. Пък за другото форматиране - предпочитам setw, setpresicion, ... пред cryptic формат
спецификаторите на Xf функциите.
спецификаторите на Xf функциите.
Re: Уточнение за низовете в C++
Oстанал съм с впечатление, че Strostrup също яко мрънка против
вградените масиви и в частност употребата на char *, ама
пустата backwards compatibility...
вградените масиви и в частност употребата на char *, ама
пустата backwards compatibility...
Re: Уточнение за низовете в C++
В стандарното С++ има 3-4 стандартни класа - String, Stream, List и още май имаше. Създавани паралелно с разработването на езика.. (така поне пише по разните книги)
Защо всеки си пише заместители? Хубав въпрос...
Примерни причини:
* малко и неразнообразен сет от стандартни класове
* липса на source фаилове за тези класове - наличие само на *.Н и *.LIB.
* липса на UNICODE поддръжка
* несъвместимост между различните компилатори на различни платформи
* измислете си и други...
Друго:
Ако не желаете да правите провека за null при работа със CString* (или други класове*) - не ползвайте *... Тоя & за това са го сложили... (това вече всъшност го споменаха вече)
Така принуждавате винаги да ви подават като параметър нещо различно от null - проверката за null се изнася извън функцията и вие си пиете по-спокойно бирата...
Защо всеки си пише заместители? Хубав въпрос...
Примерни причини:
* малко и неразнообразен сет от стандартни класове
* липса на source фаилове за тези класове - наличие само на *.Н и *.LIB.
* липса на UNICODE поддръжка
* несъвместимост между различните компилатори на различни платформи
* измислете си и други...
Друго:
Ако не желаете да правите провека за null при работа със CString* (или други класове*) - не ползвайте *... Тоя & за това са го сложили... (това вече всъшност го споменаха вече)
Така принуждавате винаги да ви подават като параметър нещо различно от null - проверката за null се изнася извън функцията и вие си пиете по-спокойно бирата...
Re: String.IsNullOrEmpty
Ами String е обект, а не примитивен тип.
Ако направят String примитивен тип, тогава ще почнат някой да реват що няма "bla".substring(1, 2), що няма bla.indexOf("ala") и др. такива.
String са е обект и това е положението. И ще се проверява за null, ако не искаш Null Pointer Exception. Добре, че са направили този статичен метод да улеснят живота на разработчиците.





Ако направят String примитивен тип, тогава ще почнат някой да реват що няма "bla".substring(1, 2), що няма bla.indexOf("ala") и др. такива.
String са е обект и това е положението. И ще се проверява за null, ако не искаш Null Pointer Exception. Добре, че са направили този статичен метод да улеснят живота на разработчиците.
Re: String.IsNullOrEmpty
> тогава ще почнат някой да реват що няма "bla".substring(1, 2),
> що няма bla.indexOf("ala") и др. такива.
Аз много свикнах и се кефя на такъв синтаксис
City = Line.Substring(0, Line.Length - State.Length).Replace("'", "''").Trim();
Изобщо можеш да си добавящ .Func() накрая до безкрай и всичко на един ред - адски удобно.
> що няма bla.indexOf("ala") и др. такива.
Аз много свикнах и се кефя на такъв синтаксис
City = Line.Substring(0, Line.Length - State.Length).Replace("'", "''").Trim();
Изобщо можеш да си добавящ .Func() накрая до безкрай и всичко на един ред - адски удобно.
Re: String.IsNullOrEmpty
> И това е така щото там около 1970-та година Кърниган и Ричи като са измислили C не са му сложили вграден тип за символен низ.
Как искаш от господата да сложат примитивен тип низ, като това нещо не се поддържа от процесорите. Все пак С е правено да е максимално близко до процесора на машината.
Аз поддържам мнението, че низът е клас и трябва да се разглежда като клас, а не като примитивен тип. Даже съм склонен да няма глезотиите от сорта на "ала" + "бала". Ама да не затормозяват разработчиците на Джава, Гослинг решил да го направи специален тип клас, пък .НЕТ копират от Джавата.
Според мен това си е най-правилното решение включително и с метода isNullOrEmpty.
Как искаш от господата да сложат примитивен тип низ, като това нещо не се поддържа от процесорите. Все пак С е правено да е максимално близко до процесора на машината.
Аз поддържам мнението, че низът е клас и трябва да се разглежда като клас, а не като примитивен тип. Даже съм склонен да няма глезотиите от сорта на "ала" + "бала". Ама да не затормозяват разработчиците на Джава, Гослинг решил да го направи специален тип клас, пък .НЕТ копират от Джавата.
Според мен това си е най-правилното решение включително и с метода isNullOrEmpty.
Забравяш един важен аспект - Уникод.
В STL има string, ама той си е 8-битов, има и wstring (wide char май беше 32-битов).
Другите момчета си дефинират техни класове за низ, щото им трябва читава поддръжка на Уникод. В Qt си е Уникод и почти идентичен, като низа на Джава. Т.е. можеш да използваш различни кодови таблици да конвертираш Уникод от и към 8-битово кодиране.
Другите момчета си дефинират техни класове за низ, щото им трябва читава поддръжка на Уникод. В Qt си е Уникод и почти идентичен, като низа на Джава. Т.е. можеш да използваш различни кодови таблици да конвертираш Уникод от и към 8-битово кодиране.
Re: String.IsNullOrEmpty
В отговор на:Как искаш от господата да сложат примитивен тип низ, като това нещо не се поддържа от процесорите.
А къде пише, че трябва да се поддържа хардуерно от процесорите, за да го има като примитивен тип? Колко време процесорите караха с емулация на плаваща запетая пък по езиците си имаше съответните типове? ANSI Common Lisp откога има тип за рационално число? Виж комплексните числа в C99...
От името IsNullOrEmpty получавам гърчове. Все пак искам един метод да прави едно нещо, а не и да ми връща True ако другата седмица папата има рожден ден (има ли мераклии за метод IsNullOrEmptyOrPopeBirthday?). Предпочитам да се оправи интерфейса или семантиката на типа. Продължавам да твърдя, че тази надбавка е някакъв зъл хак.
--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck
Re: String.IsNullOrEmpty
Аз лично не разбирам много много какво става вътрешно във фреймуърка, как са представени reference and value type и прочие (дърпам гридове от туулбокс-а обаче със много яко отработено движение и трябва скромно да призная, че съм доста добър).
Забелязъл съм обаче, че value тип-а int има както методи - int.Parse(string number), така и пропертита (int.MaxValue, int.MinValue).
Тоест едва ли е било невъзможно да направят string value type и да му запазят полезните джиджавки String.Append, String.SubString и прочие.
--
Increasing performance by lowering expectations.
Забелязъл съм обаче, че value тип-а int има както методи - int.Parse(string number), така и пропертита (int.MaxValue, int.MinValue).
Тоест едва ли е било невъзможно да направят string value type и да му запазят полезните джиджавки String.Append, String.SubString и прочие.
--
Increasing performance by lowering expectations.
Редактирано от Гypy на
Re: Забравяш един важен аспект - Уникод.
всъщност е шаблон - std::basic_string.
string и wstring са удобни typedefs - използвайки съответно char и wchar за параметър.
Оригиналната идея е ако някой реши да си направи тип MySpecialCharType
да получи наготово съответната стринг поддръжка -
typedef std::string<MySpecialCharType> MySpecialStringType.
Ама старите навици трудно умират...
string и wstring са удобни typedefs - използвайки съответно char и wchar за параметър.
Оригиналната идея е ако някой реши да си направи тип MySpecialCharType
да получи наготово съответната стринг поддръжка -
typedef std::string<MySpecialCharType> MySpecialStringType.
Ама старите навици трудно умират...
Re: Уточнение за низовете в C++
Чесно казано точно за С++ говоря...
Цитати от книга писана от "Създателя" г-н Браян... (свободен неособено добър мой превод от руски)
Надявам се че ще ви отговорят на част от въпросите...
"Раннни библиотеки
Първия код, написан на C With Classes, беше билиотека за поддръжка на многозадачност, в която се развиваше Simula-подобни механизми за праралелност за моделиране. Първите реални програми, в които се използваше тази библиотека, беше приложение за моделиране на мрежов трафик, проектиране топологията на печатни платки и т.н.Тази библиотека се ползва интензивно и до днес. ...
...
Отначало работата с класове контейнери, като списъци и масиви, много се усложняваше поради липсата в езика на поддръжка на праметризовани типове. Трябваше да ползваме макроси. Макросите, поддържани от препроцесора на С, по-късно ни помогнаха да придобием опит, ползван после при разработката на параметризованите типове.
Самите класове проектирахме Джонатан Шопиро и аз. През 1983 той реализира класовете стринг и списък, които се ползваха в AT&T и залегнаха в основата на на класовете включени в днешната библиотека "Стандартни компоненти". Тази библиотека се разработи в Bell Labs и се продаваше чрез USL. Създаването на тези библиотеки вървеше паралелно с проектирането на езика...
Основната цел на първите библиотеки за работа със стрингове и списъци - предоставяне на относително прости класове, които да могат да се използват като строителни блокове в приложения и при създаването на много по-сложни библиотеки. ........... Освен това класовете се проектираха така, че да може да се проложат в традиционно написани програми без нужда да се пренаписват или нужда от допълнително обучение на програмистите. В часност, не се правеше никакъв опит да се предостави на позвателя възможност да модифицира поведението на тези класове с помоща на виртуални функции в базовите класове. ........
.......
Основни несъвършенности на езика
По мое мнение само една несъвършенност може да се нарече най-голямата грешка на С++. Пускането на Версия 1.0 и публикуването на моята книга [Stroustrup, 1986] трябваше да се отложи до окончателното разработване на по-пълни библиотеки, включващи такива фундаментални класове, като едно свързани и двусвързани списъци, асоциативни масиви, масиви с контрол на изхода за граници и прости стрингове. Тяхното отсъствие принуди всички да "изобретят велосипеда" и доведе до ненужно разнообразие на базови класове. ......... Освен това, много усилия бяха хвърлени за разработка на методи и инструменти работейки с библиотеки, които имаха сериозен вътрешен дефект - липса на шаблони."
Цитати от книга писана от "Създателя" г-н Браян... (свободен неособено добър мой превод от руски)
Надявам се че ще ви отговорят на част от въпросите...
"Раннни библиотеки
Първия код, написан на C With Classes, беше билиотека за поддръжка на многозадачност, в която се развиваше Simula-подобни механизми за праралелност за моделиране. Първите реални програми, в които се използваше тази библиотека, беше приложение за моделиране на мрежов трафик, проектиране топологията на печатни платки и т.н.Тази библиотека се ползва интензивно и до днес. ...
...
Отначало работата с класове контейнери, като списъци и масиви, много се усложняваше поради липсата в езика на поддръжка на праметризовани типове. Трябваше да ползваме макроси. Макросите, поддържани от препроцесора на С, по-късно ни помогнаха да придобием опит, ползван после при разработката на параметризованите типове.
Самите класове проектирахме Джонатан Шопиро и аз. През 1983 той реализира класовете стринг и списък, които се ползваха в AT&T и залегнаха в основата на на класовете включени в днешната библиотека "Стандартни компоненти". Тази библиотека се разработи в Bell Labs и се продаваше чрез USL. Създаването на тези библиотеки вървеше паралелно с проектирането на езика...
Основната цел на първите библиотеки за работа със стрингове и списъци - предоставяне на относително прости класове, които да могат да се използват като строителни блокове в приложения и при създаването на много по-сложни библиотеки. ........... Освен това класовете се проектираха така, че да може да се проложат в традиционно написани програми без нужда да се пренаписват или нужда от допълнително обучение на програмистите. В часност, не се правеше никакъв опит да се предостави на позвателя възможност да модифицира поведението на тези класове с помоща на виртуални функции в базовите класове. ........
.......
Основни несъвършенности на езика
По мое мнение само една несъвършенност може да се нарече най-голямата грешка на С++. Пускането на Версия 1.0 и публикуването на моята книга [Stroustrup, 1986] трябваше да се отложи до окончателното разработване на по-пълни библиотеки, включващи такива фундаментални класове, като едно свързани и двусвързани списъци, асоциативни масиви, масиви с контрол на изхода за граници и прости стрингове. Тяхното отсъствие принуди всички да "изобретят велосипеда" и доведе до ненужно разнообразие на базови класове. ......... Освен това, много усилия бяха хвърлени за разработка на методи и инструменти работейки с библиотеки, които имаха сериозен вътрешен дефект - липса на шаблони."
Re: String.IsNullOrEmpty
Съмнявам се да могат... Ще трябва да променят енджина на .NET, а той не работи само с VB.NET. Освен това не е мислен специално за VB.NET...
На всичко отгоре от някоя и друга година вече е стандартизиран. Така че за подобна промяна недей даже да си помиляш да сънуваш. Сутринта като се събудиш ще бъдеш разочарован от реалноста...
На всичко отгоре от някоя и друга година вече е стандартизиран. Така че за подобна промяна недей даже да си помиляш да сънуваш. Сутринта като се събудиш ще бъдеш разочарован от реалноста...
Re: Уточнение за низовете в C++
нещо пак не разбирам, какво искаш да кажеш?
че в момента в STL няма нищо друго освен String i List ли?
че в момента в STL няма нищо друго освен String i List ли?
Re: Уточнение за низовете в C++
Никъде не съм написал такова нещо...
STL е само една от библиотеките които запълват празнотата от липса на добра базова библиотека разработена заедно с езика...
Тя е разработена (ако не се лъжа) от HP. Ква ли и беше историята на тая библиотека? Нещто не ми се рови да я търся...
Но каквато и да е историята със сигурност STL не е съществувала по времето на Версия 1.0 на езика - просто не е имало шаблони още.
STL е прикрепена официално към С++ в третата версия на езика.(Във втората се поддържат шаблони, но STL май не е част от езика)
STL е само една от библиотеките които запълват празнотата от липса на добра базова библиотека разработена заедно с езика...
Тя е разработена (ако не се лъжа) от HP. Ква ли и беше историята на тая библиотека? Нещто не ми се рови да я търся...
Но каквато и да е историята със сигурност STL не е съществувала по времето на Версия 1.0 на езика - просто не е имало шаблони още.
STL е прикрепена официално към С++ в третата версия на езика.(Във втората се поддържат шаблони, но STL май не е част от езика)
C-strings-do-not-exist
Проблема е добре известен. Състои се в това, че обекта "string" в C/C++ и някои подобни езици всъщност не съществува. Допълнително усложнение е и това, че повечето програмисти не разбират смисловите различия на null string и empty string. Това води до "бозав" код, който се разлива по всички модули използващи даден "забозен" модул...
Когато даден метод връща string това значи, че трябва да връща, хм..., string. NULL не би трябвало да се счита за валидно значение. За много програмисти е ОК да върнат 0 в код който трябва да върне string. Това е така, защото какво е string? Ами това си е char*. Ако функция трябва да върне Obj*, връщането на 0 се счита за коректно (типично означава грешка - неуспех). Затова щом връщаме char* значи можем да връщаме 0? Да, ама не! Всъщност типа на връщания резултат е string! Ако функцията връщаше резутат Obj как бихте върнали 0? Никак! По исторически причини 0 се счита за коректна стойност на string. Добре все пак, че няма още някоя невалидна коректна стойност (например 1). Че тогава щеше да има метод "IsNullOrOneOrEmpty".
Много хора тук биха спорили, че 0 си е съвсем валидна стойност, че често води до мнооо ефективен код etc. Това просто не е така. Само си помислете:
1. Какво прави strcpy, извикана с NULL за стойност на src?
2. Какво прави sprintf с 0 за форматиращ стринг?
3. Какво правят strcat strcmp strchr и компания с NULL в някой от аргументите?
Ако можете да си заложите главата, че знаете отговорите (без да гледате справочник) мисля, че сте едно рядко срещано изключение.
Замислете се колко пъти сте се чудили дали някоя функция която връща string
може да върне 0.
Сега си отговорете:
хубаво ли е 0 да е коректно значение на string?
защо хората продължават да пишат такъв код?
задачки за домашно:
има ли някакъв символ, който неможете да срещнете в C/C++ string?
Ако да, как се представят стрингове с такъв символ в тях?
Обичате ли преди цикъл по някакъв стринг да правите:
size_t len = strlen(s); //защото len се ползва в цикъла???
Айде стига съм мрънкал....
Когато даден метод връща string това значи, че трябва да връща, хм..., string. NULL не би трябвало да се счита за валидно значение. За много програмисти е ОК да върнат 0 в код който трябва да върне string. Това е така, защото какво е string? Ами това си е char*. Ако функция трябва да върне Obj*, връщането на 0 се счита за коректно (типично означава грешка - неуспех). Затова щом връщаме char* значи можем да връщаме 0? Да, ама не! Всъщност типа на връщания резултат е string! Ако функцията връщаше резутат Obj как бихте върнали 0? Никак! По исторически причини 0 се счита за коректна стойност на string. Добре все пак, че няма още някоя невалидна коректна стойност (например 1). Че тогава щеше да има метод "IsNullOrOneOrEmpty".
Много хора тук биха спорили, че 0 си е съвсем валидна стойност, че често води до мнооо ефективен код etc. Това просто не е така. Само си помислете:
1. Какво прави strcpy, извикана с NULL за стойност на src?
2. Какво прави sprintf с 0 за форматиращ стринг?
3. Какво правят strcat strcmp strchr и компания с NULL в някой от аргументите?
Ако можете да си заложите главата, че знаете отговорите (без да гледате справочник) мисля, че сте едно рядко срещано изключение.
Замислете се колко пъти сте се чудили дали някоя функция която връща string
може да върне 0.
Сега си отговорете:
хубаво ли е 0 да е коректно значение на string?
защо хората продължават да пишат такъв код?
задачки за домашно:
има ли някакъв символ, който неможете да срещнете в C/C++ string?
Ако да, как се представят стрингове с такъв символ в тях?
Обичате ли преди цикъл по някакъв стринг да правите:
size_t len = strlen(s); //защото len се ползва в цикъла???
Айде стига съм мрънкал....
Re: Уточнение за низовете в C++
Ъхъ:)
Нема книга на C++, където да не се обяснява, че трябва да се зарежат printf и събратята му. Същ и как трябва да се предпочете stream вход/изхода.
Само дето досега не съм видял C++ програмист да го прави:)
Както и аз лично предпочитам printf, като много добре позната. Пък и определено не мисля че тя е големия проблем в C++ програмирането:)
Нема книга на C++, където да не се обяснява, че трябва да се зарежат printf и събратята му. Същ и как трябва да се предпочете stream вход/изхода.
Само дето досега не съм видял C++ програмист да го прави:)
Както и аз лично предпочитам printf, като много добре позната. Пък и определено не мисля че тя е големия проблем в C++ програмирането:)
Re: C-strings-do-not-exist
Доста смахнати доводи...
Ползвай примерно STL и стига мрънка, че нямало тип String...
Като не ти се пита колко е дълъг ASCIIZ стринга, не ползвай индекс в цикъла, а движи указател по стринга...
Пък за връщането на NULL указател от функция... Нямам думи... Щом ти се трие токущо създаден обект само защото всъшност е невалиден... Пиши си кода така че да въща винаги рефърънс вместо указатели и си свиркай...
Ползвай примерно STL и стига мрънка, че нямало тип String...
Като не ти се пита колко е дълъг ASCIIZ стринга, не ползвай индекс в цикъла, а движи указател по стринга...
Пък за връщането на NULL указател от функция... Нямам думи... Щом ти се трие токущо създаден обект само защото всъшност е невалиден... Пиши си кода така че да въща винаги рефърънс вместо указатели и си свиркай...
Re: C-strings-do-not-exist
Ами всъщност език C/C++ няма - фактът едобре известен ;). В C++ std::string е клас и от него може да се създават напълно нормални обекти. Между другото, малко известен факт - ограничението в std::string да няма '\0' _не_съществува_.