czwartek, 2 kwietnia 2020

Najlepszy sposób jak porównywać ze sobą stringi w c# sharpie?

Porównywanie (stringów) ciągów znaków w c#? Przecież to takie proste. Otóż nie. Sharp to bardzo bogaty język i daje nam duże pole do popisu. Trzeba znać różnice między
- "test" == "test"
- "test".Equals("test")
- "test".CompareTo("test")
- string.CompareOrdinal("testA", "testB")
== VS .Euqals Operator == porównuje ze sobą referencję stringów natomiast CompareTo porównuje zawartość. Warto to zapamiętać. Jeśli mamy taki przypadek:
 object s1 = "test"; // string
 object values = {‘t’, ‘e’, ‘s’, ‘t’}; // tablica char’ów
to przyrównując do siebie
 s1 == values // zwróci FALSE, ponieważ referencje nie wskazują na to samo miejsce w pamięci

 s1.Equals(values) // zwróci TRUE, gdyż porównamy wyłącznie zawartość
CompareTo służy do określania czy dany string jest większy, mniejszy lub równy w stosunku do innego stringa. Możliwe rezultaty:
 0 = stringi są takie same
 -1 = string A jest mniejszy od B
 1 = string A jest większy od B
Natomiast CompareOrdinal działa podobnie jak CompareTo, lecz porównuje jakby na podstawie wartości liczbowych charów w ciągu i jego wynikiem jest właśnie ta różnica. Bardzo prosto to wytłumaczyć przez prosty przykład
 string.CompareOrdinal("a", "a"); // zwróci 0 ponieważ nie ma tutaj żadnej różnicy
 string.CompareOrdinal("a", "b"); // zwróci -1 ponieważ różnica tutaj jest o jeden jeśli patrząc na tablice wartości znaków (ASCII)
 string.CompareOrdinal("a", "c"); // zwróci -2
‘a’ ma wartość 97 ‘b’ ma wartość 98 jeśli odejmiemy a od b = otrzymamy -1 Więc czego powinnismy używać do porównywania? W 99% przypadkach wystarczy użyć operatora ==, lecz jeśli zależy nam na porownaniu wartości to warto korzystać z "test".Equals("test".ToCharArray()) tyle jeśli chodzi o porównywanie stringów w csharp :)

wtorek, 22 września 2015

Do czego służy małpa w c# csharp?

Do czego służy małpa csharp?

Małpa charp ma 2 zastosowania:
1) Kiedy potrzeba zdefiniować stringa dłuższego niż na jedną linijkę (lub po prostu pociętego)
string txt = @"ala
ma 
kota";
Przy okazji w stringu z małpą csharp’pie jeśli użyjemy cudzysłowu \” to będzie go trzeba zamienić na podwójny „”
string txt =  "tytuł: \"Programista\"";
string txt = @"tytuł: ""Programista""";
2) Drugim zastosowaniem „małpa csharp” jest użycie zmiennych, które chcemy nazwać jak słowa kluczowe, np.:
string class = ""; // wygeneruje błąd podczas kompilacji
string @class= ""; // poprawnie
Bonus: bardzo dobrze jest używać małpy na początku stringów wtedy gdy tworzmy wzorce wyrażeń regularnych. Odpada nam pilnowanie znaków zaczynających się od „\”.

niedziela, 20 września 2015

C# null

Czyli wszystko co chcielibyście wiedzieć o null w c# a NIE boicie się zapytać

Na wstępie trzeba napisać oczywistą oczywistość: NULL jest w C# wartością... pustą.
Null może wystąpić w typach referencyjnych jak i "wartościowymi" (Reference types / Value types). Do typów wartościowych można go przypisać na 2 sposoby:

int? i;

Nullable i;

Obie linijki robią to samo.

Dla typów referencyjnych będzie to po prostu:
Object o;
 
W kodzie bardzo często można zauważyć notoryczne sprawdzanie czy czasem jakiś obiekt nie jest nullem.
if (obj == null || i.HasValue) {
//...
}
 
inną techniką jest użycie ?? (dwa pytajniki)
Object result = obj ?? new Object()
 
znaczy: jeśli obj jest null, to podstaw pod result new Object();
Istnieje możliwość jeszcze takiego (pięknego) zapisu):
string result = value1 ?? value2 ?? value3 ?? String.Empty;
 
Nie jest to dobra praktyka tym bardziej, że jeśli gdzieś nie przewidzimy warunku wtedy dostaniemy po oczach wyjątkiem "nullreferenceexception". Dobrą obroną jest utworzenie "specjalnego przypadku" (Special case / Null object pattern). Całość sprowadza się do utworzenia podklasy, reprezentującej wartości "puste", np.:
class Osoba {
   string Imie {get;set;}
   string Nazwisko {get;set;}
}
 
tworzymy reprezentację "nullową/specjalny warunek":
class OsobaNull : Osoba {
   public OsobaNull() {
       Imie = "";
       Nazwisko = "";
   }
}
 
i tylko w jednym przypadku sprawdzamy null, tam gdzie pobieramy obiejkt typu osoba, jeśli tam wykryjemy nulla to zwracamy new OsobaNull() i nigdzie już nie potrzebujemy sprawdzać żadnych warunków. Kod się wykona ale będą tak ustawione wartości obiektu, że kod nic zlego nie zrobi i nie zakończy się błędem.

piątek, 18 września 2015

Entity Framework jak działa metoda Include [c#]

Niebezpieczeństwa w używaniu metody Include podczas budowania zapytań



Kiedy zaczynamy zabawę z Entity Framework'iem w .NET'cie wszystko wydaje się na prawdę proste. Piszemy co chcemy wyciągnąć za pomocą składni LINQ robimy np. wykonujemy zapytanie i już mamy wyciągnięte dane. Lecz do końca nie jest tak różowo jak się nam wydaje. Entity Framework ma taką naturę, że jeśli przestaniemy mu patrzeć na ręce bardzo szybko może nas wprowadzić w poważne tarapaty. Bardzo dobrym pomysłem jest zainstalowanie sobie darmowego Express Profiler i podglądanie jakie zapytania zostają wysyłane do bazy. Czasem na prawdę można się przestraszyć jakie potwory musi przetrawić baza. Począwszy od kilku zagnieżdżeń aż po kilometrowe SELECTy. Trzeba uważać w szczególności na metodę Include, która jest super narzędziem, lecz należy dołączać STARANNIE wyselekcjonowane dane. Trzeba uważać na długie ścieżki. Zamiast pisać

...Include("Osoba").Include("Osoba.Kraj").Include("Osoba.Kraj.Zdjecie")

lepiej jest:

.Include("Osoba.Kraj.Zdjecie")

Wygenerowane zapytanie jest mniejsze a im mniejsze tym lepsze. Dlatego też jeśli to możliwe obcinać SELECTy przez określenie jakie kolumny nas interesują .Select(p => .....)

czwartek, 17 września 2015

Podstawy wyjatków w csharp [c#]

Krótko o podstawach wyjątków (exceptions) w c#

W samym .NETcie istnieje bardzo dużo zdefiniowancyh już wyjątków, które możemy użyć w naszej aplikacji. Dziś skupimy się wyłącznie na podstawowych informacjach. Każdy wyjątek dziedziczy po klasie Exception. Jest to klasa nadrzędna dla exceptionów. Schodząc niżej o jeden poziom następuje podział na: ApplicationException oraz SystemException.

SystemException - po tej klasie dziedziczą wszystkie systemowe (dotnetowe) wyjątki takie jak nasz "ulubiony" NullPointerException. Można w skrócie powiedzieć, iż są to wyjątki dla niskopoziomowych części systemu.

ApplicationException - dziedziczą po niej wyjątki rzucane w wysokopoziomowych częściach aplikacji. Jeśli piszemy jakąś aplikację to dobrze jest aby nasze customowe wyjątki właśnie po niej dziedziczyły. Np. przypuścmy wystąpiła w naszej aplikacji jakaś sytuacja wyjątkowa, wtedy rzucamy naszym własnym wyjątkiem np. CustomException, dziedziczącym po ApplicationException.

Cała moc exeptionów właśnie w hierarchii w ich łapaniu. Dawno temu kiedy jeszcze nie było wyjątków reagowanie na wyjątkowe sytuacje odbywało się przez zwracanie odpowiedniego kodu błędu. Można było się w tym pogubić.

Zobaczmy prosty przykład użycia:
class NameException : ApplicationException {}

//----
// jakieś linie kodu
// i dochodzi do sytuacji wyjątkowej
//----


try{

  if (string.IsNullOrEmpty(name)) {
   throw new NameException();
  }
}catch(NameException ex) {
 // tutaj przejdzie sterowanie
}
catch(ApplicationException ex){ 
 // tutaj nie przejdzie
}
catch(Exception ex) {
 // tutaj tez nie przejdzie
}

Jeślibyśmy rzucili zamiast NameException jakimś innym dziedziczącym po ApplicationException to by wpadło do drugiego catcha. Natomiast wyrzucony wyjątek dziedziczyłby zaraz po klasie Exception to by wpadł do 3 catcha.
Dlatego bardzo ważna jest hieriarchia aby odpowiednio móc przechwytywać i reagować na wyjątki.

czwartek, 28 maja 2015

Bootstrap dobra ksiązka

Bootstrap - Twoje szukanie dobrej książki dotyczącej bootstrapa chyba dobiegło końca

Pamiętam doskonale czasy kiedy jak się chciało stworzyć jakąś aplikację internetową, to nie mogło się obejść bez grafika i "cssmana". W pomyśle na "mega-super-biznes" zawsze istniała skromna pozycja: "grafika + cięcie szablonu". Lecz mimo wszystko rodzi, to problemy czasowo-finansowe. Kto? Jak? Co? Za ile? I dlaczego nie może być taniej i szybciej, przecież pomysł wypali na 100% a kasa i wieczna chwała czeka tuż za rogiem...? ;) Po paru latach na świat przyszedł bootstrap, który wywodzi się z podobnego problemu. W "twitterze" mieli już dość tworzenia osobnych szablonów dla wewnętrznych systemów. Ujednolicenie okazało się zbawieniem...?

Spoglądając na dzisiejsze "startupy" można powiedzieć jedno: bootstrap się przyjął i jest powszechnie stosowany. Ujednolicony html, z jsem tworzą na prawdę całkiem przyjemną strukturę do pracy nawet dla średniozorientowanego programisty, ktory z cssem i htmlem ma niewiele wspólnego. A jeśli doliczymy do tego możliwość zakupu "wypasionych bootstrapów" z themeforest.net, startbootstrap.com etc to już nasze życie programisty posiadającego pomysł na biznes staje się o ciut prostsze (i tańsze zarazem) ;) Podobny układ graficzny wychodzi jedynie na plus dla użytkownika, który wchodząc na taką stronę odnosi wrażenie, że gdzieś to już widział i zna dzięki temu interface. Oczywiście zależy to dużo od szablonu, lecz stosując się do pewnych standardów spokojnie możemy standaryzować internet.

Dla osób chcących poznać dokładnie bootstrapa... dobra książka


C# 6.0 i MVC 5. Tworzenie portali internetowych - opinie / recenzja

Czy warto kupić ksiązkę C# 6.0 i MVC 5. Tworzenie portali internetowych?

Po "nagabywaniu" na facebooku i na niektórych blogach doszedłem do wniosku, że trzeba sprawdzić tę książkę, czy rzeczywiście jest tak dobra jak o niej piszą. W sam raz trafiła się promocja na ebookpointcie z okazji dnia książki (?) jeśli dobrze pamiętam i bam! Za pół ceny można zobaczyć co tam polscy autorzy napisali... nie mam zbyt pozytywnych opinii o polskich autorach książek technicznych niestety (za wyjątkiem Jarosława Zabiełło).

Spis treści prezentuje się imponująco. Mamy przekrój przez język c# od wersji 2.0 po (zapowiedź) 6.0. Wg mnie to bardzo miłe zamieszczać coś w książce o csharp 6.0 jak nawet jeszcze się nie ukazało. Można owszem poczytać na necie co tam się znajdzie, lecz o wiele lepiej raz a dobrze zażyć taką skondensowaną kapsułę. Bardzo dobre wrażenie na mnie zrobiło zamieszczenie wzorców architektonicznych. Mimo, że w asp.net mvc taplamy się wyłącznie w MVC, to można uzupełnić wiedzę o MVP, MVVP (nawiasem mówiąc asp.net mvc, to nie jest tak na prawdę prawdziwy MVC, lecz wzorzec model-2, ale to inna bajka). Cieszy też fakt, że postały pokrótce objaśnione terminy DDD, SOA, EDA. Nie spodziewałem się, że w książce dotyczącej ASP.NET można jeszcze znaleźć opis jak działa i jak jest podzielona cała platforma .NET. Są to takie smaczki tej książki, żadne wodolejstwo.

Książka "C# 6.0 i MVC 5. Tworzenie portali internetowych" wprowadza czytelnika w świat Entity Framework oraz całego stosu webowego. Wystarczająco są opisane każde aspekty, z którymi przyjdzie pracować podczas tworzenia aplikacji internetowej. Nie ma sensu tak na prawdę ich przytaczać bowiem znajdziemy wszystko co jest najważniejsze / najciekawsze np. metody asynchroniczne, cache, bezpieczeństwo, modeview, routing, IoC, ba! nawet znajdziecie zasady SOLID, słów kilka o bazach nieralacyjnych MongoDB, RavenDB.

Czy warto kupić tę książkę? Odpowiedź może być zaskakująca, ale jeśli ktoś pracuje z ASP.NET MVC, parę lat np. od wersji 2.0 czy 3.0 to myślę, że "samoistnie" się nauczył niemal wszystkiego. Natomiast dodatki uzupełni przeglądając wyrywkowo blogi lub jakieś tutoriale. Oczywiście książka usystematyzuje / uporządkuje wiedzie, lecz aż tak tego nie czuć. Natomiast jeśli jakaś osoba czuje, że ma braki np. Entity Framework jest dla niej czarną (lub szarą) magia, chętnie chciałby się dowiedzieć czegoś więcej o MVC jak to działa, jak używać etc to ZDECYDOWANIE MUSI MIEĆ TĘ KSIĄŻKĘ. Czyli, jeśli zjadłeś zęby na ".necie", może warto kupić, lecz jeśli ten świat jest dla Ciebie nowy lub czujesz, że czegoś Ci brak, to śmiało, kupuj bez namysłu.