Sytuacja jest mniej więcej następująca: w klasie dajmy na to Loguj jest właściwość: public bool IsLogged { get; } w konstruktorze tej klasy: *public Loguj(string name, bool isLogged) * jest instrukcja: IsLogged=isLogged czyli jeżeli właściwość automatyczna nie ma settera to można nadać wartość tylko i wyłącznie w konstruktorze - zaznaczam, że docelowa platforma ustawiona jest na .NEt Framework 4.5
możesz też dodać w miejscu deklaracji
public bool IsLogged { get; }=true;
a_s_f napisał(a):
możesz też dodać w miejscu deklaracji
public bool IsLogged { get; }=true;
a to nie dopiero od wersji 4.6 ??
a to nie dopiero od wersji 4.6 ??
mylisz wersję języka z wersją frameworka. nowe funkcje języka mogą być w większości używane ze starymi wersjami frameworka - możesz ten kod skompilować nawet na 2.0 o ile masz wystarczająco nowoczesny kompilator
Pijany Lew napisał(a):
a to nie dopiero od wersji 4.6 ??
mylisz wersję języka z wersją frameworka. nowe funkcje języka mogą być w większości używane ze starymi wersjami frameworka - możesz ten kod skompilować nawet na 2.0 o ile masz wystarczająco nowoczesny kompilator
czyli np. jakie funkcje? ...bo chyba nie w przypadku, gdy wersja platformy wprowadza nową klasę np. ZipFile (dostępną od .NET 4.5)
...dopytuję tak bo chciałbym się upewnić czy dobrze rozumiem :)
Dodatkowe smaczki językowe, np. $"interpolacja stringów"
albo out variables albo pattern matching. Kod C# i tak się kompiluje do IL, więc póki trzymasz się bibliotek dostępnych dla danej platformy to nie ma znaczenia której wersji C# używasz.
Interpolacja znaków za kulisami przekształcana jest na wywołanie String.Format() o ile dobrze pamiętam, dlatego zmieniając w właściwościach projektu platformę docelową z .NET 4.5 na .NET 2.0 kod dalej się kompiluje (bo String.Format() było już w CLR 2.0) ... ale nie skompiluje się już, gdy dodatkowo w programie jest używana metoda np. ZipFile.ExtractToDirectory() dlatego, że jest ona dostępna dopiero od .NET Framework 4.5 bo (innymi słowy) kompresja, dekompresja ZIP została oprogramowana w .NET 4.5, a ZipFile.ExtractToDirectory() nie da się jak w przypadku interpolacji przekształcić na wywołanie metod(y) będących już w .NET 2. (CLR 2.0) ...czy dobrze to rozumiem?
Zasadniczo tak: po prostu w .NET 2.0 nie ma w ogóle klasy ZipFile, dlatego nie działa.
Ale to kwestia platformy, a nie języka. Dodatkowe rzeczy dorzucane do C# jako takiego (np. "out variables") działają niezależnie od wersji .NET na jakiej uruchamiasz.
Dodaj private set czyli coś takiego
public bool IsLogged { get; private set; }
Kodem typu
public bool IsLogged { get; }=true;
nie osiągniesz tego co chcesz osiągnąć, bo tylko ustawisz domyślną wartość, a Ty chcesz modyfikować tą wartość w kontruktorze. Dzięki prywatnemu seterowi nie będziesz mógł modyfikować tej właściwość z zewnątrz klasy tylko w jej wnętrzu.
Manuel.Artificer napisał(a):
Dodaj private set czyli coś takiego
public bool IsLogged { get; private set; }
Kodem typu
public bool IsLogged { get; }=true;
nie osiągniesz tego co chcesz osiągnąć, bo tylko ustawisz domyślną wartość, a Ty chcesz modyfikować tą wartość w kontruktorze. Dzięki prywatnemu seterowi nie będziesz mógł modyfikować tej właściwość z zewnątrz klasy tylko w jej wnętrzu.
Zgadza się, przykład sugeruje potrzebę dodania private set, ale to tylko przyklad kodu niewiele mający ( a w zasadzie nic) z moim zadaniem i celem, skupilem sie tylko na kodzie -szczegółach języka bo w docelowej klasie raz zainicjowana właściwość nie będzie podlegać zmianie czyli przypisanie do właściwości odbędzie się analogicznie do: public bool IsLogged { get; }=true; lub w konstruktorze
To do tego służy słowo READONLY.
Juhas napisał(a):
To do tego służy słowo READONLY.
Też, ale od kiedy mamy właściwości automatyczne rdonly nie jest konieczne tymbardziej ze wymagało by dodatkowego pola i instrukcji dla właściwości, ...get{ return pole....
Juhas napisał(a):
To do tego służy słowo READONLY.
Też, ale od kiedy mamy właściwości automatyczne rdonly nie jest konieczne tymbardziej ze wymagało by dodatkowego pola i instrukcji dla właściwości, ...get{ return pole....
Ktos napisał(a):
Zasadniczo tak: po prostu w .NET 2.0 nie ma w ogóle klasy ZipFile, dlatego nie działa.
Ale to kwestia platformy, a nie języka. Dodatkowe rzeczy dorzucane do C# jako takiego (np. "out variables") działają niezależnie od wersji .NET na jakiej uruchamiasz.
Czasami nowe ficzery języka działają ze starszymi frameworkami, czasami nie. Ciekawym przykładem jest async
: normalnie wymaga Frameworka 4.5, ale Microsoft wypuścił oficjalną paczkę umożliwiającą obsługę w 4.0 (a nieoficjalne biblioteki istnieją dla 3.5 jezeli nie wcześniej).
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.