inicjalizacja właściwości

0

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

0

możesz też dodać w miejscu deklaracji

 public bool IsLogged { get; }=true;
0
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 ??

1

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

0
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 :)

0

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.

0

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?

0

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.

0

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.

0
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

0

To do tego służy słowo READONLY.

0
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....

0
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....

0
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).

1 użytkowników online, w tym zalogowanych: 0, gości: 1