Bardzo cieszy mnie w C# obecność instrukcji foreach, gdyż bardzo przydawała mi się ona, gdy programowałam w PHP.
Jednak w przeciwieństwie do PHP C# nie pozwala na zmianę wartości danej kolekcji w tejże pętli.
Bardzo cieszy mnie w C# obecność instrukcji foreach, gdyż bardzo przydawała mi się ona, gdy programowałam w PHP.
Jednak w przeciwieństwie do PHP C# nie pozwala na zmianę wartości danej kolekcji w tejże pętli.
To lubię…
Podobnie jak w PHP do którego „luzu” się przyzwyczaiłam przez ostatnie lata, w C# nie muszę się przejmować rozmiarem tablic:) Generalnie wygląda to tak, że pakujemy sobie do tablicy to co trzeba, a następnie możemy pobrać rozmiar tablicy, którą w ten sposób otrzymaliśmy.
Przykład deklaracji tablicy:
int[] NazwaTablicy;
Oczywiście zamiast int może być dowolna nazwa typu – czy to wbudowanego czy zdefiniowanego przez użytkownika.
Przypisywanie danych do tablic odbywa się raczej standardowo poprzez użycie nawiasów kwadratowych. Z kolei pobranie rozmiaru tablicy wygląda następująco:
NazwaTablicy.length;
Jako że w C/C++ pisałam dużo więcej niż w C# do tej pory i choć były to zamierzchłe czasy a programy niekomercyjne to jednak bardzo ciekawią mnie różnice między tymi dwoma językami. Generalnie lubię mieć punkt odniesienia w postaci jakiegoś języka, który znam i móc sobie do niego porównać to z czym mam do czynienia. Interesują mnie takie drobne niuanse typu – w tym języku tak, a w tamtym inaczej. Wiedza o nich przydaje się również, gdy potrzebujemy szybko napisać coś w języku do którego nie jesteśmy przyzwyczajeni. Ja na przykład pisząc na co dzień w PHP często łapałam się na pisaniu znaku dolara przed zmiennymi w C++ i uparcie zapominałam o typach;) Takie przykłady można by mnożyć, ja tymczasem mam zamiar mnożyć tutaj drobne różnice między C/C++ i C# z uwagi na fakt, że właśnie mam szansę na dobre z C# się zabrać. Podejrzewam więc, że notka ta będzie pierwszą z takiego cyklu.
Pierwsza nowa dla mnie rzecz jaka spodobała mi się w C# to możliwość uniknięcia maskowania znaków specjalnych w stringach. W C/C++ string, który zawiera znaki specjalne (backslash, nowa linia) musi jednocześnie zawierać też znaki maskujące – backslash.
Przykładowo:
cout << "Przykład na użycie escape'owania: C:\\Folder1\\Folder2\\file1.txt";
Żeby móc wyświetlić backslash w środku tego stringa musieliśmy go zamaskować.
Tymczasem w C# wystarczyłoby dodać przed stringiem znak małpki – @.
Przykładowo:
Console.Writeline(@"Przykład na użycie escape'owania: C:\Folder1\Folder2\file1.txt");
Rozwiązanie zastosowane w C# jest bardzo wygodne, ponieważ sprawia, że nie musimy się martwić o to, co zawiera dany string:)
Najprostszy oczywiście nie oznacza najlepszy. Można go użyć, jeśli z jakiś przyczyn nie chcemy tworzyć kodu C# w osobnym pliku i mamy coś megaprostego do zrobienia.
Załóżmy więc, że mamy taki oto prościutki formularz:
1 2 3 4 5 | <form action="index.aspx">
<input name="login" type="text">
<input name="password" type="password">
<input type="submit" name="Zaloguj" value="Zaloguj">
</form> |
Fajnie by było, gdyby po błędnym zalogowaniu formularz nadal pamiętał login jaki wpisaliśmy w pole login.
Zmienimy więc odpowiednio linijkę numer 2:
2 3 | <input name="login" type="text" value="<%=HttpUtility.HtmlEncode(Request.QueryString["login"])%>"> |
W ten sposób wartość pola login będzie zawsze miała taką wartość jaka została wpisana przed wysłaniem formularza.
Generalnie Request.QueryString["login"] przechowuje wartość pola „login”.
Jest to jedna z moich ulubionych funkcjonalności z cyklu „ułatwiających życie” w Visual Studio:)
Snippety umożliwiają łatwe wstawienie kawałka „szablonowego” kodu – np. if…else, for, switch itd.
Dostępne snippety można przejrzeć wybierając z menu Tools->Code Snippets Manager. Można w tym miejscu tworzyć również swoje własne snippety.
Wstawić snippet do swojego kodu można poprzez wpisanie przypisanego do niego słowa i naciśnięcie tabulatora (szerzej o tym sposobie będzie dalej, ponieważ uważam go za zdecydowanie wygodniejszy) lub poprzez wybranie z menu Edit->InteliSense->Insert Snippet (kombinacja klawiszy: Ctrl+K, X), następnie wybranie Visual C# oraz wybranie żądanego snippetu.
Najfajniejsze i najprzydatniejsze wg mnie po kolei :
Cel: utworzenie dyrektywy kompilacji warunkowej (nie będę wchodzić w szczegóły działania poszczególnych kawałków kodu, ponieważ nie to jest przedmiotem tej notki;))
Słowo, które wpisujemy: #if (i naciskamy tab)
Otrzymujemy:
#if true #endif
(kursor znajduje się na słowie true, dzięki czemu łatwo możemy zmienić je na takie jakiego potrzebujemy)
Cel: utworzenie dyrektywy pozwalającej na ukrywanie (zwijanie) kodu w edytorze
Słowo, które wpisujemy: #region
Otrzymujemy:
#region MyRegion #endregion
(kursor znajduje się na słowie MyRegion, umożliwiając natychmiastową zmianę nazwy regionu)
Cel: utworzenie szkieletu klasy
Słowo, które wpisujemy: class
Otrzymujemy:
class MyClass { }
(kursor znajduje się na słowie MyClass)
Cel: utworzenie wywołania funkcji Console.Writeline
Słowo, które wpisujemy: cw
Otrzymujemy:
Console.WriteLine();
(kursor znajduje się w nawiasie celem wpisania tam tekstu jaki ma zostać wyświetlony)
Cel: utworzenie szkieletu pętli do…while
Słowo, które wpisujemy: do
Otrzymujemy:
do { } while (true);
(kursor znajduje się na słowie true – wpisujemy treść warunku)
Cel: utworzenie szkieletu instrukcji else
Słowo, które wpisujemy: else
Otrzymujemy:
else { }
(kursor znajduje się między nawiasami)
Cel: utworzenie szkieletu pętli for
Słowo, które wpisujemy: for
Otrzymujemy:
for (int i = 0; i < length; i++) { }
(kursor znajduje się na zmiennej i w pierwszym wyrażeniu, umożliwiając jej zmianę – jeśli w tym miejscu zmienimy i, to zmieni się ono też w pozostałych wyrażeniach; naciśnięcie tabulatora spowoduje przejście do zmiennej length w drugim wyrażeniu i umożliwi jej zmianę)
Cel: utworzenie szkieletu pętli foreach
Słowo, które wpisujemy: foreach
Otrzymujemy:
foreach (object var in collection_to_loop) { }
(kursor znajduje się na słowie object umożliwiając wyedytowanie kolejny parametrów – var, collection_to_loop)
Cel: utworzenie szkieletu pętli forr
Słowo, które wpisujemy: forr
Otrzymujemy:
for (int i = length - 1; i >= 0; i--) { }
(kursor znajduje się na zmiennej i w pierwszym wyrażeniu – działa podobnie jak snippet dla for, ale iteracja idzie w drugą stronę)
Cel: utworzenie szkieletu pętli if
Słowo, które wpisujemy: if
Otrzymujemy:
if (true) { }
(kursor znajduje się na słowie true)
Cel: utworzenie wywołania funkcji MessageBox.Show();
Słowo, które wpisujemy: mbox
Otrzymujemy:
MessageBox.Show("Test");
(kursor znajduje się na słowie Test)
Cel: utworzenie szkieletu instrukcji definiującej przestrzeń nazw
Słowo, które wpisujemy: namespace
Otrzymujemy:
namespace MyNamespace { }
(kursor znajduje się na słowie MyNamespace)
Cel: utworzenie szkieletu instrukcji switch
Słowo, które wpisujemy: switch
Otrzymujemy:
switch (switch_on) { default: }
(kursor znajduje się na słowie switch_on)
Cel: utworzenie szkieletu instrukcji try…catch
Słowo, które wpisujemy: try
Otrzymujemy:
try { } catch (Exception) { throw; }
(kursor znajduje się na słowie Exception)
Cel: utworzenie szkieletu instrukcji while
Słowo, które wpisujemy: while
Otrzymujemy:
while (true) { }
(kursor znajduje się na słowie true)