Ustawianie właściwości bez settera

0

Dzień dobry, zastanawia mnie jedna rzecz otóż. Jak wiadomo właściwości od C# 3.0 zastępują prywatne pola z setterami i getterami, jednakże jak zrealizować taki kod:

    class Klasa
    {
        private string _name;
        public string GetName()
        {
            return _name;
        }
        public Klasa(string name)
        {
            _name = name;
        }
    } 

? Bo gdy zrobię tak:

    class Klasa
    {
        public string Name { get; }

        public Klasa(string name)
        {
            Name = name;    // tu jest blad
        }
    } 

to dostaję błąd (nie dziwi mnie to, po prostu chciałbym mieć właściwość, której poza klasą nie można modyfikować, a wewnątrz tak? Da się tak? Czy trzeba stosować rozwiązanie numer 1?

5

private set;...

1
class Class {
    private string _name;
    public string Name {
        get { return this._name; }
        set { this._name = value; }
    }
}

Dla "prostych" typów danych możesz zwyczajnie napisać":

public string Name { get; set; }

Name to własność z getterem i setterem.

A w swoim kodzie masz błąd, bo Twoja własność jest tylko do odczytu gdyż posiada tylko getter. Jeżeli nie chcesz żeby _name było modyfikowalne na zewnątrz klasy to zrób pole prywatne i do tego pola zrób gettera, a w konstruktorze nadawaj wartości polu prywatnemu.

0

Dołącze się do tematu, czy mogę w tel linijce public string Name { get; set; } jakoś określić wartość tej zmiennej?

1

W C# 6.0 był pomysł na primary constructor:

struct Pair<T>(T first, T second)
{
  public T First { get; } = first;
  public T Second { get; } = second;
}

Ale nie przeszło (chociaż przez krótką chwile sie kompilowało) - niewykluczone że będą w C# 7.0 albo późniejszych.

Poza tym jest też od 6.0:

int First { get; set; } = 10;

Poza tym raczej nie ma sposobu (na inicjalizacje w ten samej linijce co deklaracja).

0

swoja droga to wydaje mi sie ze te primary konstrutory czy inline inicjalizacja dla property to troche przegiecia, mala wartosc dodana a robi burdel w kodzie

0

Primary constructors mi się nie podoba, za dużo zamieszania. Za to możliwość inicjalizacji pól - cukierek składniowy ale bardzo fajny :)
Z 2 strony zawsze można to zrobić... w konstruktorze.

0

Może komuś się przyda, już znalazłem to co chciałem:

 public string Name { get; private set; }

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