Co w C # odróżnia pole od właściwości i kiedy należy użyć pola zamiast właściwości?
c#
properties
field
Anonimowy
źródło
źródło
Odpowiedzi:
Właściwości ujawniają pola. Pola powinny (prawie zawsze) być prywatne dla klasy i dostępne za pośrednictwem właściwości get i set. Właściwości zapewniają poziom abstrakcji, który pozwala zmieniać pola, nie wpływając jednak na sposób, w jaki są dostępne dla rzeczy używanych przez twoją klasę.
@Kent zwraca uwagę, że właściwości nie są wymagane do enkapsulacji pól, mogą wykonać obliczenia na innych polach lub służyć innym celom.
@GSS wskazuje, że możesz także wykonywać inne operacje logiczne, takie jak sprawdzanie poprawności, gdy dostęp do właściwości jest kolejną przydatną funkcją.
źródło
string
, moja umowa to: przypisz dowolne znaki do długości ~ 2bil. Jeśli właściwość jestDateTime
, moją umową jest: przypisanie dowolnych liczb w granicach DateTime, które mogę wyszukać. Jeśli twórca doda ograniczenia do seterów, ograniczenia te nie zostaną zakomunikowane. Ale jeśli zamiast tego twórca zmieni typ zstring
naSurname
, wówczas ich nowa klasa Nazwisko komunikuje ograniczenia, a właściwośćpublic Surname LastName
nie ma sprawdzania poprawności setera. PonadtoSurname
jest wielokrotnego użytku.Surname
w moim przykładzie można ponownie używać, nie musisz się martwić o późniejsze kopiowanie / wklejanie tych sprawdzeń poprawności w ustawieniach właściwości do innych miejsc w kodzie. Nie zastanawiasz się też, czy weryfikacja nazwiska odbywa się w wielu miejscach, jeśli zmienisz reguły biznesowe dotyczące Nazwisk. Sprawdź link, który zamieściłem o Value ObjectsZorientowane obiektowo zasady programowania mówią, że wewnętrzne działanie klasy powinno być ukryte przed światem zewnętrznym. Jeśli ujawnisz pole, w gruncie rzeczy odsłonisz wewnętrzną implementację klasy. Dlatego zawijamy pola właściwościami (lub metodami w przypadku Javy), aby umożliwić nam zmianę implementacji bez rozbijania kodu w zależności od nas. Widząc, jak możemy umieścić logikę we właściwości, pozwala nam również wykonywać logikę sprawdzania poprawności itp., Jeśli jest to potrzebne. C # 3 ma prawdopodobnie mylące pojęcie właściwości automatycznych. To pozwala nam po prostu zdefiniować Właściwość, a kompilator C # 3 wygeneruje dla nas prywatne pole.
źródło
public int myVar { get; set; }
naprawdę oznacza (i przypuszczam, że to jest powód dla co najmniej 50% odsłon trafia to pytanie).virtual
samo w sobie jest częścią programowania obiektowego.virtual
Jednak nie zadzwoniłbym do OOP per se. Jest to narzędzie, które umożliwia polimorfizm, który jest jednym z kluczowych narzędzi ENABLES OOP. Nie jest to jednak OOP samo w sobie, i nie ma nic z natury OOP w publicznej autoferty. Nie liczyłbym też takich rzeczy jak OOP związane z refleksją lub wiązaniem danych. Normalnie nie byłbym tak pedantyczny, ale odpowiedź wyraźnie wymieniała zasady OO jako siłę napędową kodu i nie zgadzam się z tym.Ważną różnicą jest to, że interfejsy mogą mieć właściwości, ale nie pola. To, według mnie, podkreśla, że właściwości powinny być używane do definiowania publicznego interfejsu klasy, podczas gdy pola mają być używane w prywatnych, wewnętrznych działaniach klasy. Z reguły rzadko tworzę pola publiczne i podobnie rzadko tworzę nieruchomości niepubliczne.
źródło
Podam kilka przykładów użycia właściwości, które mogą spowodować zmianę biegów:
źródło
Za pomocą właściwości można wywołać zdarzenie, gdy wartość właściwości zostanie zmieniona (inaczej. PropertyChangedEvent) lub przed zmianą wartości w celu obsługi anulowania.
Nie jest to możliwe w przypadku pól (bezpośredni dostęp do).
źródło
Ponieważ wiele z nich wyjaśniło zalety i wady techniczne
Properties
orazField
, nadszedł czas na przykłady w czasie rzeczywistym.1. Właściwości pozwala ustawić poziom dostępu tylko do odczytu
Rozważ przypadek
dataTable.Rows.Count
idataTable.Columns[i].Caption
. Pochodzą z klasyDataTable
i oba są dla nas publiczne. Różnica w poziomie dostępu do nich polega na tym, że nie możemy ustawić wartości,dataTable.Rows.Count
ale możemy czytać i pisaćdataTable.Columns[i].Caption
. Czy to możliweField
? Nie!!! Można to zrobićProperties
tylko za pomocą .2. Właściwości w PropertyGrid
Być może pracowałeś
Button
w Visual Studio. Jego właściwości są pokazane wPropertyGrid
niczymText
,Name
itd. Kiedy przeciągnij i upuść przycisk, a kiedy klikamy właściwości, zostanie ona automatycznie znaleźć klasyButton
i filtryProperties
i pokazać, że wPropertyGrid
(gdziePropertyGrid
nie pokażeField
chociaż są publiczne).W
PropertyGrid
, właściwościName
iText
zostaną pokazane, ale nieSomeProperty
. Dlaczego??? Ponieważ właściwości mogą akceptować atrybuty . Nie pokazuje się w przypadku, gdy[Browsable(false)]
fałsz.3. Potrafi wykonywać instrukcje w obrębie Właściwości
4. Tylko właściwości mogą być używane w Binding Source
Binding Source pomaga nam zmniejszyć liczbę wierszy kodu.
Fields
nie są akceptowane przezBindingSource
. Powinniśmy do tego wykorzystaćProperties
.5. Tryb debugowania
Rozważmy, że używamy
Field
do przechowywania wartości. W pewnym momencie musimy debugować i sprawdzić, gdzie wartość staje się pusta dla tego pola. Trudno będzie to zrobić, gdy liczba wierszy kodu jest większa niż 1000. W takich sytuacjach możemy użyćProperty
i ustawić tryb debugowania wewnątrzProperty
.źródło
RÓŻNICE - ZASTOSOWANIA (kiedy i dlaczego)
Pole jest zmienną, która jest zadeklarowana bezpośrednio w klasie lub struktura. Klasa lub struktura może mieć pola instancji lub pola statyczne lub oba te elementy. Zasadniczo należy używać pól tylko dla zmiennych, które mają dostęp prywatny lub chroniony . Dane, które klasa wystawia na kod klienta, należy przekazywać metodami, właściwościami i indeksatorami. Korzystając z tych konstrukcji do pośredniego dostępu do pól wewnętrznych, można zabezpieczyć się przed nieprawidłowymi wartościami wejściowymi.
Nieruchomość jest członkiem, który zapewnia elastyczny mechanizm do odczytu, zapisu lub obliczyć wartość prywatnym terenie. Właściwości mogą być używane tak, jakby były publicznymi elementami danych, ale w rzeczywistości są to specjalne metody zwane akcesoriami . Umożliwia to łatwy dostęp do danych i nadal pomaga promować bezpieczeństwo i elastyczność metod . Właściwości umożliwiają klasie ujawnienie publicznego sposobu uzyskiwania i ustawiania wartości, jednocześnie ukrywając kod implementacyjny lub weryfikacyjny. Accessor własności get służy do zwrócenia wartości właściwości, a setor accessor służy do przypisania nowej wartości.
źródło
Właściwości mają tę podstawową zaletę, że umożliwiają zmianę sposobu dostępu do danych obiektu bez przerywania jego publicznego interfejsu. Na przykład, jeśli chcesz dodać dodatkowe sprawdzanie poprawności lub zmienić zapisane pole na obliczone, możesz to zrobić z łatwością, jeśli początkowo odsłoniłeś pole jako właściwość. Jeśli bezpośrednio odsłoniłeś pole, musisz zmienić publiczny interfejs swojej klasy, aby dodać nową funkcjonalność. Ta zmiana spowodowałaby uszkodzenie istniejących klientów, wymagając ich ponownej kompilacji, zanim będą mogli korzystać z nowej wersji kodu.
Jeśli napiszesz bibliotekę klas zaprojektowaną do powszechnego użytku (np. .NET Framework, z którego korzystają miliony ludzi), może to stanowić problem. Jednak jeśli piszesz klasę używaną wewnętrznie w małej bazie kodu (powiedzmy <= 50 K linii), to naprawdę nie jest wielka sprawa, ponieważ twoje zmiany nie wpłyną negatywnie na nikogo. W takim przypadku tak naprawdę sprowadza się to do osobistych preferencji.
źródło
Właściwości obsługują asymetryczny dostęp, tzn. Możesz mieć moduł pobierający i ustawiający lub tylko jeden z nich. Podobnie właściwości wspierają indywidualną dostępność dla gettera / settera. Pola są zawsze symetryczne, tzn. Zawsze można zarówno uzyskać, jak i ustawić wartość. Wyjątkiem są pola tylko do odczytu, których oczywiście nie można ustawić po inicjalizacji.
Właściwości mogą działać przez bardzo długi czas, mieć skutki uboczne, a nawet rzucać wyjątki. Pola są szybkie, bez skutków ubocznych i nigdy nie rzucą wyjątków. Ze względu na skutki uboczne właściwość może zwracać inną wartość dla każdego połączenia (jak może to mieć miejsce w przypadku DateTime.Now, tj. DateTime.Now nie zawsze jest równy DateTime.Now). Pola zawsze zwracają tę samą wartość.
Pola mogą być używane dla parametrów out / ref, właściwości mogą nie. Właściwości obsługują dodatkową logikę - można jej użyć między innymi do leniwego ładowania.
Właściwości obsługują poziom abstrakcji, ujmując wszystko, co oznacza pobranie / ustawienie wartości.
Używaj właściwości w większości / wszystkich przypadkach, ale staraj się unikać skutków ubocznych.
źródło
W tle właściwość jest kompilowana na metody. Tak więc
Name
właściwość jest wkompilowana wget_Name()
iset_Name(string value)
. Możesz to zobaczyć, jeśli przestudiujesz skompilowany kod. Podczas korzystania z nich występuje (bardzo) niewielki narzut wydajności. Zwykle zawsze będziesz używać właściwości, jeśli wystawisz pole na zewnątrz i często będziesz używać go wewnętrznie, jeśli będziesz musiał dokonać walidacji wartości.źródło
Jeśli chcesz, aby twoja prywatna zmienna (pole) była dostępna dla obiektu twojej klasy z innych klas, musisz utworzyć właściwości dla tych zmiennych.
na przykład, jeśli mam zmienne o nazwach „id” i „name”, które są prywatne, ale może się zdarzyć, że ta zmienna będzie potrzebna do operacji odczytu / zapisu poza klasą. W takiej sytuacji właściwość może mi pomóc w odczytaniu / zapisaniu tej zmiennej w zależności od zdefiniowanego dla tej właściwości parametru get / set. Właściwością może być zarówno readonly / writeonly / readwrite oba.
tutaj jest demo
źródło
Drugie pytanie tutaj: „kiedy należy użyć pola zamiast właściwości?”, Jest tylko krótko poruszone w tej drugiej odpowiedzi i trochę tak samo , ale nie bardzo szczegółowe.
Ogólnie rzecz biorąc, wszystkie pozostałe odpowiedzi dotyczą trafnego projektu: wolą eksponowanie właściwości niż eksponowanie pól. Chociaż prawdopodobnie nie będziesz regularnie powtarzać: „wow, wyobraź sobie, o ile gorsze byłyby rzeczy, gdybym uczynił to pole zamiast własności”, jednak o wiele rzadziej jest myśleć o sytuacji, w której powiedziałbyś „wow, dzięki Bogu użyłem tu pola zamiast nieruchomości. ”
Ale jest jedna zaleta, że pola mają właściwości, a jest to ich zdolność do wykorzystania jako parametry „ref” / „out”. Załóżmy, że masz metodę z następującym podpisem:
i załóżmy, że chcesz użyć tej metody do przekształcenia tablicy utworzonej w ten sposób:
Oto, moim zdaniem, najszybszy sposób, aby to zrobić, ponieważ X i Y są właściwościami:
I to będzie całkiem niezłe! Chyba że masz pomiary, które dowodzą inaczej, nie ma powodu, aby smród. Uważam jednak, że technicznie nie jest tak szybki, jak to:
Wykonując niektóre pomiary , wersja z polami zajmuje około 61% czasu w porównaniu z wersją z właściwościami (.NET 4.6, Windows 7, x64, tryb wydania, bez dołączonego debuggera). Im droższa
TransformPoint
metoda, tym mniej wyraźna staje się różnica. Aby powtórzyć to sam, biegnij z komentarzem pierwszego wiersza i bez komentarza.Nawet jeśli powyższe nie przyniosłyby korzyści w zakresie wydajności, istnieją inne miejsca, w których użycie parametrów ref i out może być korzystne, na przykład podczas wywoływania rodziny metod Interlocked lub Volatile . Uwaga: W przypadku, gdy jest to dla ciebie nowość, Volatile jest zasadniczo sposobem na uzyskanie takiego samego zachowania, jakie zapewnia
volatile
słowo kluczowe. Jako taki,volatile
nie rozwiązuje w magiczny sposób wszystkich problemów związanych z bezpieczeństwem nici, jak sugeruje jego nazwa.Zdecydowanie nie chcę wyglądać tak, jakbym opowiadał się za „och, powinienem zacząć odsłaniać pola zamiast właściwości”. Chodzi o to, że jeśli musisz regularnie używać tych członków w wywołaniach, które przyjmują parametry „ref” lub „out”, szczególnie w przypadku czegoś, co może być prostym typem wartości, który prawdopodobnie nigdy nie potrzebuje żadnego z elementów wartości dodanej właściwości, można argumentować.
źródło
Chociaż pola i właściwości wydają się do siebie podobne, są to 2 zupełnie różne elementy językowe.
Pola są jedynym mechanizmem przechowywania danych na poziomie klasy. Pola są zmiennymi koncepcyjnie w zakresie klasy. Jeśli chcesz przechowywać niektóre dane w instancjach swoich klas (obiektów), musisz użyć pól. Nie ma innego wyboru. Właściwości nie mogą przechowywać żadnych danych, choć może się wydawać, że są w stanie to zrobić. Patrz poniżej.
Z drugiej strony właściwości nigdy nie przechowują danych. Są to tylko pary metod (get i set), które można syntaktycznie wywoływać w podobny sposób jak pola, aw większości przypadków uzyskują dostęp (do odczytu lub zapisu) do pól, co jest źródłem pewnych nieporozumień. Ale ponieważ metody własności są (z pewnymi ograniczeniami, takimi jak stały prototyp) zwykłymi metodami C #, mogą robić to, co mogą zrobić zwykłe metody. Oznacza to, że mogą mieć 1000 linii kodu, mogą zgłaszać wyjątki, wywoływać inne metody, mogą być nawet wirtualne, abstrakcyjne lub przesłonięte. Tym, co wyróżnia właściwości, jest fakt, że kompilator C # przechowuje dodatkowe metadane w zestawach, których można użyć do wyszukiwania określonych właściwości - funkcja powszechnie używana.
Pobierz i ustaw metody właściwości ma następujące prototypy.
Oznacza to, że właściwości mogą być „emulowane” poprzez zdefiniowanie pola i 2 odpowiednich metod.
Taka emulacja właściwości jest typowa dla języków programowania, które nie obsługują właściwości - takich jak standardowy C ++. W języku C # zawsze powinieneś preferować właściwości jako sposób dostępu do swoich pól.
Ponieważ tylko pola mogą przechowywać dane, oznacza to, że więcej klas pól zawiera, więcej obiektów pamięci takiej klasy zużyje. Z drugiej strony dodanie nowych właściwości do klasy nie powoduje powiększenia obiektów tej klasy. Oto przykład.
Chociaż metody własności mogą zrobić wszystko, w większości przypadków służą one do uzyskiwania dostępu do pól obiektów. Jeśli chcesz, aby pole było dostępne dla innych klas, możesz to zrobić na dwa sposoby.
Oto klasa wykorzystująca pola publiczne.
Chociaż kod jest całkowicie poprawny, z punktu widzenia projektu ma kilka wad. Ponieważ pola można zarówno odczytywać, jak i zapisywać, nie można uniemożliwić użytkownikowi pisania do pól. Możesz zastosować
readonly
słowo kluczowe, ale w ten sposób musisz zainicjować pola tylko do odczytu tylko w konstruktorze. Co więcej, nic nie stoi na przeszkodzie, aby przechowywać niepoprawne wartości w swoich polach.Kod jest prawidłowy, wszystkie zadania zostaną wykonane, choć są nielogiczne.
Age
ma wartość ujemną,YearOfBirth
jest daleko w przyszłości i nie odpowiada Wiekowi iFullName
jest zerowy. Za pomocą pól nie można zapobiecclass Name
popełnianiu takich błędów przez użytkowników.Oto kod z właściwościami, które rozwiązują te problemy.
Zaktualizowana wersja klasy ma następujące zalety.
FullName
iYearOfBirth
są sprawdzane pod kątem nieprawidłowych wartości.Age
nie jest zapisywalny. Jest obliczany odYearOfBirth
bieżącego roku.FullNameInUppercase
konwertowanaFullName
na UPPER CASE. Jest to trochę wymyślony przykład użycia właściwości, w którym właściwości są powszechnie używane do prezentacji wartości pól w formacie bardziej odpowiednim dla użytkownika - na przykład przy użyciu bieżących ustawień regionalnych dla określonej liczbyDateTime
formatów.Poza tym właściwości można zdefiniować jako wirtualne lub zastąpione - po prostu dlatego, że są to zwykłe metody .NET. Te same zasady dotyczą takich metod własności, jak w przypadku metod zwykłych.
C # obsługuje również indeksatory, które są właściwościami, które mają parametr indeksu w metodach właściwości. Oto przykład.
Ponieważ C # 3.0 pozwala zdefiniować właściwości automatyczne. Oto przykład.
Mimo że
class AutoProps
zawiera tylko właściwości (lub tak wygląda), może przechowywać 2 wartości, a wielkość obiektów tej klasy jest równasizeof(Value1)+sizeof(Value2)
= 4 + 4 = 8 bajtów.Powód tego jest prosty. Po zdefiniowaniu właściwości automatycznej kompilator C # generuje kod automatyczny zawierający ukryte pole oraz właściwość z metodami właściwości umożliwiającymi dostęp do tego ukrytego pola. Oto kompilator kodu, który produkuje.
Oto kod wygenerowany przez ILSpy ze skompilowanego zestawu. Klasa zawiera wygenerowane ukryte pola i właściwości.
Jak więc widać, kompilator nadal używa pól do przechowywania wartości - ponieważ pola są jedynym sposobem przechowywania wartości w obiektach.
Jak widać, chociaż właściwości i pola mają podobną składnię użycia, są to bardzo różne pojęcia. Nawet jeśli korzystasz z automatycznych właściwości lub zdarzeń - ukryte pola są generowane przez kompilator, w którym przechowywane są rzeczywiste dane.
Jeśli chcesz, aby wartość pola była dostępna dla świata zewnętrznego (użytkownicy twojej klasy), nie używaj pól publicznych ani chronionych. Pola zawsze powinny być oznaczone jako prywatne. Właściwości pozwalają na sprawdzanie wartości, formatowanie, konwersje itp. I ogólnie sprawiają, że kod jest bezpieczniejszy, bardziej czytelny i rozszerzalny dla przyszłych modyfikacji.
źródło
Ponadto właściwości pozwalają używać logiki podczas ustawiania wartości.
Możesz więc powiedzieć, że chcesz ustawić wartość w polu liczby całkowitej, jeśli wartość jest większa niż x, w przeciwnym razie wyrzuć wyjątek.
Naprawdę przydatna funkcja.
źródło
Jeśli zamierzasz używać prymitywów wątku, musisz użyć pól. Właściwości mogą uszkodzić kod wątkowy. Poza tym to, co powiedział Cory, jest poprawne.
źródło
(To naprawdę powinien być komentarz, ale nie mogę opublikować komentarza, więc przepraszam, jeśli nie jest odpowiedni jako post).
Kiedyś pracowałem w miejscu, w którym zalecaną praktyką było użycie pól publicznych zamiast właściwości, gdy równoważna właściwość def miałaby dostęp do pola, jak w:
Ich rozumowanie było takie, że w razie potrzeby pole publiczne można przekształcić w właściwość w przyszłości. Wtedy wydawało mi się to trochę dziwne. Sądząc po tych postach, wygląda na to, że niewielu tutaj też się zgodzi. Co mogłeś powiedzieć, żeby spróbować coś zmienić?
Edycja: Powinienem dodać, że cała baza kodu w tym miejscu została skompilowana w tym samym czasie, więc mogliby pomyśleć, że zmiana publicznego interfejsu klas (przez zmianę pola publicznego na właściwość) nie stanowi problemu.
źródło
Technicznie rzecz biorąc, nie sądzę, że istnieje różnica, ponieważ właściwości są tylko opakowaniami wokół pól utworzonych przez użytkownika lub automatycznie utworzonych przez kompilator. Celem właściwości jest wymuszenie enkapsulacji i zaoferowanie lekkiej funkcji podobnej do metody. Deklarowanie pól jako publicznych jest po prostu złą praktyką, ale nie ma żadnych problemów.
źródło
Pola są zwykłymi zmiennymi składowymi lub instancjami składowymi klasy. Właściwości są abstrakcją pozwalającą uzyskać i ustawić ich wartości . Właściwości nazywane są także akcesoriami, ponieważ oferują sposób zmiany i pobrania pola, jeśli ujawnisz pole w klasie jako prywatne. Zasadniczo powinieneś zadeklarować swoje zmienne składowe jako prywatne, a następnie zadeklarować lub zdefiniować dla nich właściwości.
źródło
Właściwości otaczają pola, umożliwiając w ten sposób dodatkowe przetwarzanie wartości, którą należy ustawić lub pobrać. Zazwyczaj używanie właściwości jest przesadą, jeśli nie będziesz wykonywać żadnego przetwarzania wstępnego ani końcowego na wartości pola.
źródło
IMO, Właściwości to tylko pary funkcji / metod / interfejsów „SetXXX ()” „GetXXX ()”, których używaliśmy wcześniej, ale są bardziej zwięzłe i eleganckie.
źródło
Tradycyjnie prywatne pola są ustawiane za pomocą metod pobierających i ustawiających. Ze względu na mniej kodu możesz zamiast tego używać właściwości do ustawiania pól.
źródło
kiedy masz klasę, którą jest „samochód”. Właściwości to kolor, kształt ..
Gdzie jako pola są zmienne zdefiniowane w ramach klasy.
źródło
Z Wikipedii - Programowanie obiektowe :
Właściwości są w rzeczywistości częścią zachowania obiektu, ale mają na celu dać konsumentom obiektu iluzję / abstrakcję pracy z danymi obiektu.
źródło
Mój projekt pola polega na tym, że pole musi być modyfikowane tylko przez jego element nadrzędny, stąd klasa. Wynik zmienna staje się prywatna, a następnie, aby móc dać prawo do odczytu klas / metod poza, przechodzę przez system własności tylko z Get. Pole jest następnie pobierane przez właściwość i tylko do odczytu! Jeśli chcesz go zmodyfikować, musisz przejść przez metody (na przykład konstruktor) i stwierdzam, że dzięki temu sposobowi zapewnienia ci bezpieczeństwa mamy lepszą kontrolę nad naszym kodem, ponieważ „flange”. Bardzo dobrze można zawsze podawać wszystko do wiadomości publicznej, więc każdy możliwy przypadek, pojęcie zmiennych / metod / klas itp. Moim zdaniem jest po prostu pomocą w rozwoju, utrzymaniu kodu. Na przykład, jeśli ktoś wznowi kod z polami publicznymi, może zrobić wszystko, a zatem rzeczy „nielogiczne” w odniesieniu do celu logika, dlaczego kod został napisany. To mój punkt widzenia.
Kiedy używam klasycznego modelu prywatnego pola / publicznych właściwości tylko do odczytu, dla 10 prywatnych pól powinienem napisać 10 właściwości publicznych! Kod może być naprawdę duży szybciej. Odkrywam prywatnego setera i teraz używam tylko publicznych właściwości z prywatnym seterem. Seter tworzy w tle prywatne pole.
Właśnie dlatego moim starym klasycznym stylem programowania było:
Mój nowy styl programowania:
źródło
Pomyśl o tym: masz pokój i drzwi, aby wejść do tego pokoju. Jeśli chcesz sprawdzić, kto wchodzi i zabezpieczyć swój pokój, powinieneś użyć właściwości, w przeciwnym razie nie będą to żadne drzwi i każdy z łatwością wejdzie bez żadnych regulacji
Ludzie dostają się do sekcji Jeden bardzo łatwo, nie było żadnej kontroli
Teraz sprawdziłeś osobę i wiesz, czy ma z nią coś złego
źródło
Pola są zmiennymi w klasach. Pola to dane, które można enkapsulować za pomocą modyfikatorów dostępu.
Właściwości są podobne do pól, ponieważ definiują stany i dane powiązane z obiektem.
W przeciwieństwie do pola właściwość ma specjalną składnię, która kontroluje sposób, w jaki osoba czyta dane i zapisuje dane, są one znane jako operatory get i set. Ustawionej logiki można często używać do sprawdzania poprawności.
źródło
Właściwości są szczególnym rodzajem członka klasy. We właściwościach używamy predefiniowanej metody Set lub Get. Korzystają one z akcesoriów, dzięki którym możemy odczytywać, zapisywać lub zmieniać wartości pól prywatnych.
Weźmy na przykład klasę o nazwie
Employee
z prywatnymi polami na imię, wiek i identyfikator pracownika. Nie możemy uzyskać dostępu do tych pól spoza klasy, ale możemy uzyskać dostęp do tych prywatnych pól poprzez właściwości.Dlaczego korzystamy z nieruchomości?
Upublicznienie pola klasy i ujawnienie go jest ryzykowne, ponieważ nie będziesz mieć kontroli nad tym, co zostanie przypisane i zwrócone.
Aby to jasno zrozumieć na przykładzie, weźmy klasę studencką, która ma identyfikator, hasło, imię i nazwisko. Teraz w tym przykładzie jakiś problem z polem publicznym
Aby usunąć ten problem, korzystamy z metody Get and set.
Teraz bierzemy przykład metody get and set
źródło
Informacje dodatkowe: Domyślnie dostęp i dostęp do akcesoriów są tak samo dostępne, jak sama właściwość. Możesz kontrolować / ograniczać dostępność akcesorium indywidualnie (w celu uzyskania i ustawienia), stosując na nich bardziej restrykcyjne modyfikatory dostępu.
Przykład:
Tutaj get jest nadal publicznie dostępny (ponieważ właściwość jest publiczna), ale zestaw jest chroniony (bardziej ograniczony specyfikator dostępu).
źródło
Właściwości służą do wyświetlania pola. Używają akcesoriów (ustaw, pobierz), dzięki którym można odczytać, zapisać lub manipulować wartościami pól prywatnych.
Właściwości nie nazywają lokalizacji przechowywania. Zamiast tego mają akcesoria, które odczytują, zapisują lub obliczają swoje wartości.
Za pomocą właściwości możemy ustawić sprawdzanie poprawności typu danych ustawionych w polu.
Na przykład mamy prywatny wiek pola liczb całkowitych, na którym powinniśmy dopuszczać wartości dodatnie, ponieważ wiek nie może być ujemny.
Możemy to zrobić na dwa sposoby, używając gettera i settera oraz używając własności.
Właściwość zaimplementowana automatycznie, jeśli nie logujemy się w uzyskiwaniu i ustawianiu akcesoriów, możemy użyć właściwości zaimplementowanej automatycznie.
Gdy użyjesz automatycznie zaimplementowanej kompilacji właściwości, tworzy prywatne, anonimowe pole, do którego można uzyskać dostęp tylko poprzez get i set accessors.
Właściwości abstrakcyjne Klasa abstrakcyjna może mieć właściwość abstrakcyjną, którą należy zaimplementować w klasie pochodnej
Możemy prywatnie ustawić właściwość W tym możemy prywatnie ustawić właściwość auto (ustawić za pomocą w klasie)
Możesz osiągnąć to samo dzięki temu kodowi. W tym zestawie właściwości funkcja nie jest dostępna, ponieważ musimy ustawić wartość bezpośrednio w polu.
źródło
W zdecydowanej większości przypadków będzie to nazwa właściwości, do której można uzyskać dostęp, a nie nazwa zmiennej ( pole ). Powodem tego jest uważana za dobrą praktykę w .NET, aw szczególności w C #, w celu ochrony każdego elementu danych w klasie , niezależnie od tego, czy jest to zmienna instancji, czy zmienna statyczna (zmienna klasy), ponieważ jest powiązana z klasą.
Chroń wszystkie te zmienne odpowiednimi właściwościami, które pozwalają definiować, ustawiać i uzyskiwać akcesoria oraz wykonywać takie czynności, jak sprawdzanie poprawności podczas manipulowania tymi częściami danych.
Ale w innych przypadkach, takich jak klasa Math (przestrzeń nazw systemu), istnieje kilka właściwości statycznych wbudowanych w klasę. jednym z nich jest stała matematyczna PI
na przykład. Math.PI
a ponieważ PI jest dobrze zdefiniowanym fragmentem danych, nie musimy mieć wielu kopii PI, zawsze będzie miała tę samą wartość. Tak więc zmienne statyczne są czasami używane do udostępniania danych między obiektami klasy, ale są również powszechnie używane do ciągłej informacji, gdzie potrzebujesz tylko jednej kopii fragmentu danych.
źródło