Gettery i settery w C# - kilka pytań

Gettery i settery w C# - kilka pytań
Min0s
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:83
0

Witam, mam kilka pytanek, jednak najpierw kod:

Kopiuj
    class Liczby
    {
        public int a;
        public int liczba {
            get 
            {
                Console.WriteLine("Pobrano wartość");
                return a;
            }
            set
            {
                Console.WriteLine("Zmieniono wartość");
                a = value;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Liczby cyfra = new Liczby();
            cyfra.liczba = 5;
            int x = cyfra.liczba;
            Console.WriteLine(x.ToString());
            Console.Read();
        }
    }

1.Czy dobrze rozumuję zastosowanie "getterów" i "setterów" ? Patrz: WriteLine'y.
2.Czy to:

Kopiuj
int a { get; set; }

jest równoznaczne z tym?

Kopiuj
int a;

Jeśli nie: to po co takie "puste" get i set?
3.Jakie jest praktyczne zastosowanie get i set w aplikacjach/ grach/ hackach itp.? Mile widziane przykłady.
A i proszę o niezbyt skomplikowane terminy :D.

edytowany 3x, ostatnio: Min0s
katelx
co to sa hacki?
Min0s
Programy modyfikujące pamięć procesu (chyba dobrze to ująłem xD). W każdym razie chodziło mi o jakikolwiek przykład
katelx
ok, dzieki za wyjasnienie
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1855
0
Min0s
Podany przykład nie udziela odpowiedzi na wszystkie moje pytania, poza tym nie jest on dla mnie zbyt jasny. Przed założeniem tematu przejrzałem kilka stron, a mimo to nadal mam wątpliwości (patrz 3 pytania). Czy mógłbyś oprzeć tłumaczenie na własnym przykładzie?
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
2

Twój kod nie bardzo ma sens, bo do zmiennej a i tak możesz dostać się z zewnątrz bo jest public. Powinna być private.

  1. No dobrze, ciężko źle zrozumieć bo jak sama nazwa wskazuje get pobiera wartość, a set ustawia.
  2. Nie. W pierwszym przypadku kompilator utworzy prywatną zmienną, do której będziesz mógł się dostać tylko przy pomocy akcesorów. W drugim masz zwykłą zmienną.
  3. Praktyczne zastosowanie to np. hermetyzacja.
Min0s
Właśnie na taką odpowiedź liczyłem. Mam jeszcze tylko jedno pytanie. Po co zużywać zmienne typu private?
somekind
Pytania w dyskusji lepiej zadawać w postach niż komentarzach.
Min0s
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:83
0

A, i skoro pierwszy zapis tworzy prywatną zmienną, to po co pisać tak:

Kopiuj
int a { get; set; }

Skoro można tak?

Kopiuj
private int a;
Tumeg
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:687
0

A potem będziesz pisał gettery/settery do każdej zmiennej ?

edytowany 1x, ostatnio: Tumeg
Min0s
Nie bardzo rozumiem.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 15 godzin
1

Pierwsze jest właściwością (property) a drugie polem (field).

W działaniu są takie same, ale właściwość zawsze będziesz mógł rozbudować o gettera i settera, a pole musiałbyś zamienić na właściwość albo funkcje. W przypadku np. publicznego API taka zmiana byłaby problematyczna.

Zaleca się nie robić publicznych pól, tylko właściwości.

edytowany 1x, ostatnio: Azarien
Min0s
W jakim sensie będę mógł rozbudować tę właściwość (int a { get; set; }) o gettera i settera, skoro ma już przypisany "pusty" getter i setter?
Azarien
tworząc niepusty.
flowCRANE
@Min0s - na temat dyskutuj w postach;
Min0s
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:83
0

Pomyślałem, że można to wykorzystać do zabezpieczenia programu w taki sposób, że możliwa jest tylko inkrementacja zmiennej (gracze wiedzą, że jednorazowo awansuje się tylko o jeden poziom wyżej) i stworzyłem taki kod:

Kopiuj
    class liczby
    {
        private int a = 0;
        public int liczba {
            get
            {
                Console.WriteLine("Pobrano wartość");
                return a;
            }
            set
            {
                if (value != a+1)
                    Console.WriteLine("Nieprawidłowa wartość!");
                else
                {
                    Console.WriteLine("Poprawna inkrementacja - zmieniono wartość");
                    a++;
                }
            }  
        }   
    }
    class Program
    {
        static void Main(string[] args)
        {
            int a=0;
            liczby cyfra = new liczby();
            cyfra.liczba = 1;
            Console.WriteLine(cyfra.liczba.ToString());
            while (a!= -1)
            {
                a = int.Parse(Console.ReadLine());
                cyfra.liczba += a;
                Console.WriteLine(cyfra.liczba.ToString());
            }
        }
    }

Czy był to dobry pomysł? Można inaczej-lepiej ? Czy mój kod nie jest zły?

edytowany 6x, ostatnio: Min0s
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 15 godzin
2

Czy był to dobry pomysł? Można inaczej-lepiej ? Czy mój kod nie jest zły?

Lepszym byłaby raczej funkcja inkrementująca wartość.

Kopiuj
public int LevelUp()
{
  return ++a;
}
edytowany 1x, ostatnio: Azarien
Zobacz pozostałe 2 komentarze
SO
"Wykiwanie" CheatEngine tzn.? I co to zmienia, że złoto dodaje się losowo?
Min0s
@some_ONE zmienia to to, że przy "poziomowaniu" wystarczy inkrementacja, a przy złocie to już większe wartości, losowane z przedziału.
SO
No to losuj przy pomocy klasy Random. Ale to temat o właściwościach i tego dotyczyło moje pytanie.
Azarien
@spartanPAGE: przecież była mowa o jednorazowo awansuje się tylko o jeden poziom wyżej, więc nie "prosta liczba", tylko nazwa z dziedziny problemu.
spartanPAGE
Przepraszam, przyznaje sie do olania pytania i wybiorczego czytania odpowiedzi
QO
  • Rejestracja:około 11 lat
  • Ostatnio:10 miesięcy
  • Postów:40
1

@Azarien
Ostatnio oglądałem materiał-ciekawostkę opisujący zalety tworzenia większości klas jako niemutowalnych i tłumaczący odradzał m.in. trzymanie logiki w setterach, z racji potrzebnej większej ilości testów i potencjalnych efektów ubocznych.
Przyznam, że mnie temat zaciekawił, bo wygląda na to, że takie zamrożenie stanu obiektu, faktycznie ułatwiło by testowanie tylko ciekawi mnie jakie haczyki w tym ew. się kryją.
Ten przykład pewnie napisałby w stylu:

Kopiuj
class liczby
    {
        private readonly int a;
        public liczby(int a)
        {
            this.a = a;
        }
        public liczby LevelUp()
        {
            return new liczby(++a);
        }

    }
 
edytowany 1x, ostatnio: QwertzOne
Azarien
nie widzę specjalnie zalet, a wadę poważną: marnowanie zasobów.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Wrocław
3
Min0s napisał(a):

Pomyślałem, że można to wykorzystać do zabezpieczenia programu w taki sposób, że możliwa jest tylko inkrementacja zmiennej (gracze wiedzą, że jednorazowo awansuje się tylko o jeden poziom wyżej) i stworzyłem taki kod

To nie służy do zabezpieczania programów, co najwyżej do pisania hermetycznego kodu.

Czy był to dobry pomysł? Można inaczej-lepiej ? Czy mój kod nie jest zły?

Jest zły, bo we właściwościach piszesz coś na konsoli. Obiekt, który przechowuje jakieś dane nie powinien się zajmować operacjami wejścia/wyjścia, to łamanie zasady jednej odpowiedzialności.

QwertzOne napisał(a):

Ostatnio oglądałem materiał-ciekawostkę opisujący zalety tworzenia większości klas jako niemutowalnych i tłumaczący odradzał m.in. trzymanie logiki w setterach, z racji potrzebnej większej ilości testów i potencjalnych efektów ubocznych.

Zależy jakiej logiki. Jeśli to ma być naliczanie rabatu na podstawie historii zakupów klienta, to faktycznie słaby pomysł. Ale jeśli inkrementacja jakiejś wartości, walidacja albo rzucenie zdarzenia zmiany wartości, to już ma sens.

Przyznam, że mnie temat zaciekawił, bo wygląda na to, że takie zamrożenie stanu obiektu, faktycznie ułatwiło by testowanie tylko ciekawi mnie jakie haczyki w tym ew. się kryją.

Jedyny haczyk to chyba to, że modyfikacja obiektu powoduje tak naprawdę utworzenie nowego, więc tych obiektów robi się dużo i GC ma więcej pracy.

Min0s
Ja nie tworzę żadnej gry, tym bardziej w konsoli, chodziło mi tylko o przykład i przetestowanie.
somekind
Niczego w moim poście to nie zmienia.
CA
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:7
1

Dobrą praktyką jest hermetyzacja danych. Dane są prywatne lub chronione, kiedy mają być wykorzystywane jedynie wewnątrz tej samej klasy/ klasy tej oraz pochodnej. Czasami bywa, że są dane które chcemy z klasy pobrać, oczywiście muszą być publiczne. Możemy wykorzystać zwykłe zmienne lub właściwości.

Pierwsza rzeczą są przyzwyczajenia nasze oraz ogólna koncepcja Microsoftu. Mając dokumentacje np. klasy widzisz jakie posiada metody oraz właściwości. Nie masz za to pól. VS inaczej oznacza property, wiec też z przyzwyczajenia szukamy tego symbolu klucza jako property.

Wyobraź sobie teraz że masz wielki projekt. Robimy jakąś aplikacje w której użytkownik dostanie wartość w jednostkach metr. Jednak pod koniec projektu chcemy zmienić na centymetry. Zmiana wartości pokrzyżuje nam wewnętrzne przeliczenia w klasie. Property używamy tylko do wyświetlania wyniku. Wiec nic nie szkodzi jak w property damy getera który pomnoży naszą wartość dodatkowo o 100.

Property można traktować jako funkcje/metody które pobierają nam potrzebną wartość z klasy. Skoro pobieramy ją z zewnątrz to jest publiczna. Ale możemy narzucić jej ograniczenia, np uniemożliwić jej zmianę wartości z zewnątrz (prywatny setter). W innych językach pisało się metody get_Nazwa() do pobrania danej i set_Nazwa(wartosc) do zmiany, a tutaj to zapewniają nam property

Podsumowując zalety to:

  1. Elastyczność - możemy odwoływac się w dwojaki sposób do zmiennej
  2. Enkapsulacja- property pokazuja nam co możemy pobrac, nie naruszamy klasy wewnętrznej- najważniejsza cecha
  3. Mniejszy kod- zwykła modyfikacja zmiennej o 100 może powodować wiele wiecej linijek kodu czasami,a geter załatwi nam to w jednej
  4. praktyczność- według mnie lepsze niż definiowanie metod do tego, zarazem jest to bardziej czytelne
Min0s
A czy stosowanie set jako wywołanie autozapisu danych gry lub aktualizacja wartości w textboxie, to też dobry pomysł?
somekind
Wartość w textboxie przez set jak najbardziej można ustawiać, zwłaszcza jeśli chcesz to robić spoza klasy okna. Co rozumiesz przez autozapis danych? No i serio o takie rzeczy pytaj w postach nie komentarzach. :)
Min0s
Autozapis czyli podmiana starej wartości na nową no x.x
somekind
Zmiana wartości to nie zapis.
CA
No jeżeli chcesz przypisać danemu polu inną wartość to możesz użyć property (set ustawi wartość polu za który odpowiada), szczególnie jak robisz to z zewnątrz klasy to nawet powinieneś.
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:6 dni
  • Postów:2512
1

Na świetny przykład jak nie używać getterów i setterów natknąłem się ostatnio tutaj:
http://mcfunley.com/from-the-annals-of-dubious-achievement
Cały tekst jest wart przeczytania, ale o akcesorach jest ostatni paragraf:

I guess the StackOverflow snippet doesn't capture this, but the best thing about Richard's code was that he loved property getters and setters. No, wait, that's not quite right. Lots of people love getters and setters, but Richard seemed to be in love with getters and setters. So much so that about 70% of his logic took place in them. More than once I deleted code that looked like this:
foo.x = foo.x;
Only to break entire pages, because the side effects of that assignment were doing everything. Anyway, I hope you can all see where I was coming from now.

edytowany 2x, ostatnio: Sarrus
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
5

imo pakowanie jakiejkolwiek logiki do get/set to prawie zawsze zly pomysl, tak samo jak posiadanie nieprywatnego settera w klasach innych niz dto.
jesli potrzebujemy miec jakas logike w klasie (a juz zwlaszcza zmieniajaca jej stan) to najlepiej zastanowic sie nad stworzeniem metody, ktorej nazwa w sensowny sposob powie czego tak naprawde sie mozemy po niej spodziewac.

Min0s
Zatem co najlepiej umieszczać w get/set?
Sarrus
@Min0s Nie zadawaj pytań na temat w komentarzach
Min0s
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:83
0

Zatem co najlepiej umieszczać w get/set?
Lepiej tak:

Kopiuj
int sprawdz (int co) {
int wynik=0;
if (co>5)
	wynik=10;
return wynik;
}
int liczba=0;
int Liczba {
	set {
		sprawdz(value);
	}
}

niż

Kopiuj
int liczba=0;
int Liczba 
{
	set {
	if (value>5)
		liczba=10;
return liczba;
	}
}

?
//Najpierw dostaję ochrzan za pisanie postów, a teraz za komentarze -_-

edytowany 3x, ostatnio: Min0s
somekind
Kiedy i od kogo dostałeś ochrzan za posty?
Min0s
Ahh, mój błąd, źle przeczytałem xd.
Sarrus
A do komentarza nie był ochrzan, tylko pouczenie ;)
Min0s
Proszę o odpowiedź :p
FA
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:475
1

Moim zdaniem mozna tam umieszczac jakąś prostą walidacje, jakies mechanizmy do notyfikacji o zmianie stanu obiektu itd

Min0s napisał(a):

Lepiej tak:

Kopiuj
int sprawdz (int co) {
	int wynik=0;
	if (co>5)
		wynik=10;
return wynik;
}
int liczba=0;
int Liczba {
	set {
		sprawdz(value);
	}
}

niż

Kopiuj
int liczba=0;
int Liczba 
{
	set {
	if (value>5)
		liczba=10;
return liczba;
	}
}

?

Lepszy jest pierwszy sposób, bo oddziela logike walidacji od zmiany stanu obiektu. Wtedy mozesz np wszystkie walidacje przeniesc do osobnej klasy albo nawet biblioteki i przy drobnej zmianie (np z 10 na 9) nie musisz przegladnac pierdyliona miejsc

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:6 dni
  • Postów:2512
1

Zatem co najlepiej umieszczać w get/set?

Generalnie zasady są takie:
SET - ustawia wartość właściwości. Obiekt wewnętrznie może ustawiać wartości innych pól, ale raczej w uzasadnionych przypadkach. W żadnym wypadku użycie nie może powodować zmian stanów innych obiektów (zewnętrznych), ani wywoływać jakichś operacji biznesowych, powodować wymiany pakietów sieciowych, albo zapisów na dysk. Takie rzeczy wywołuje się metodami.

GET - zwraca wartość właściwości. Może być przeliczana na bieżąco, ale nie powinna się tworzyć np. nowa tablica czy nowy obiekt, bo częste wywoływanie może powodować problemy wydajnościowe. I tak jak w przypadku SET nie może być logiki, bo jej wywołanie jest w kodzie wówczas niejawne.

edytowany 1x, ostatnio: Sarrus
Min0s
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:83
0

Czyli jednak nie trzeba rezygnować z logiki w set/get?
A wywoływanie metod w set/get?

edytowany 2x, ostatnio: Min0s
FA
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:475
1

No jakos ta walidacje trzeba odpalic, nie?:)

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
2
Min0s napisał(a):

Czyli jednak nie trzeba rezygnować z logiki w set/get?
A wywoływanie metod w set/get?

czyli trzeba uzywac zdrowego rozsadku. skoro skladnia jezyka dopuszcza taka mozliwosc to znaczy ze mozna tak robic, czy warto to juz inna kwestia, ja odradzam bo sie wiele razy na tym przejechalam. nie widze powodu zeby do gettera/settera wrzucac jakakolwiek logike, chyba ze lenistwo (ktore potem procentuje w czasie zmarnowanym na szukanie bugow i/lub refaktoring).
walidacja w setterach brzmi bardzo zachecajaco, jednak co gdy warunki nie przechodza i leci wyjatek albo logowane jest cos do pliku albo jeszcze lepiej do bazy danych? jest to troche glupawe gdy przy skladni wygladajacej jak przypisanie wartosci jednej do drugiej moze sie stac pierdyliard roznych rzeczy.
jak dla mnie naturalnym jest ze gdy widze kod typu

Kopiuj
point.X = -1;

to nie ma prawa mi sie to wywalic ani powodowac zadnych side effectow, co innego gdy robie point.TrySetX(-1);

Kopiuj
 gdzie od razu wiem ze musze miec sie na bacznosci.
edytowany 1x, ostatnio: katelx
somekind
skoro skladnia jezyka dopuszcza taka mozliwosc to znaczy ze mozna tak robic - nie można tylko da się :)
katelx
@somekind pewnie kto inny by powiedzial ze 'trzeba, po to sa one' ;)
Min0s
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:83
0

Jak może wyglądać dobra walidacja w get/set? Chciałbym chociaż prosty kod.

edytowany 1x, ostatnio: Min0s
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
1
Kopiuj
if(argument jest nie spoko)
{
    throw new ArgumentException("tu opis problemu");
}
edytowany 1x, ostatnio: flowCRANE
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)