Inne osoby, które są w stanie sprawdzić wartości kontrolne w seterze, jest bardziej podstawowym powodem do preferowania właściwości do zmiennych publicznych?Dlaczego preferować właściwości dla zmiennych publicznych?
Odpowiedz
Przedtem mieliśmy ten temat, ale nie mogę teraz znaleźć niczego.
W skrócie: Twoje potrzeby mogą się zmienić: w przypadku braku kontroli poprawności teraz, może być wymagane w przyszłości. Jeśli jednak zmienisz swoje publiczne pola na właściwości, łamie to binarną kompatybilność: każdy klient, który użyje twojego kodu/biblioteki, będzie musiał ponownie skompilować.
To jest złe, ponieważ potencjalnie kosztuje dużo pieniędzy.
Korzystanie z właściwości od samego początku pozwala uniknąć tego problemu. Nawet liczy się kod, który nie jest częścią biblioteki. Czemu? Ponieważ nigdy nie wiadomo: kod (nawet jeśli jest wysoce zależny od domeny!) Może okazać się przydatny, więc chcesz go przekształcić w bibliotekę. Ten proces refaktoryzacji jest oczywiście znacznie łatwiejszy, jeśli już korzystasz z właściwości zamiast pól publicznych/chronionych.
Dodatkowo, pisząc publicznych właściwości jest łatwy w C# 3.0, ponieważ można po prostu użyć właściwości auto-wdrożone, oszczędzając sporo kodu:
public DataType MyProperty { get; set; }
wdroży pole oporowe konieczne i getter/setter Kod dla ciebie.
Dodam notatkę osobistą: zachowanie .NET w tym zakresie jest nieco leniwe. Kompilator może po prostu zmienić publiczne pola na właściwości w locie, unikając w ten sposób problemu. VB6 zrobił to już dla klas narażonych na COM i nie widzę absolutnie żadnego powodu, żeby VB.NET i C# nie robili tego samego. Być może ktoś z zespołów kompilatorów (Jared?) Może komentować to.
Zignorowanie pytania powinno być spowodowane wieloma przyczynami, dla których kompilator nie może tego zrobić. Są 2 powody, które przychodzą nam na myśl. 1) nazwy i 2) wywoływanie właściwości nie jest tym samym, co dostęp do pola (wydajność, ref i out). Niestety nie ma tu wystarczająco dużo miejsca, aby naprawdę komentować – JaredPar
(cd) i wątek jest zamknięty. Ale krótka wersja to użytkownik, który prosi o jeden przedmiot i dajesz mu zastępczą wymianę. Użytkownicy często są nieszczęśliwi, gdy to robisz. – JaredPar
Dzięki za odpowiedź, Jared. :-) –
Jeff Atwood has blogged about it:
Istnieją uzasadnione powody, aby dokonać własność trywialne, dokładnie tak, jak przedstawione powyżej:
- Odbicie działa inaczej od zmiennych vs właściwości, więc jeśli opierają się na refleksji, że to łatwiejsze wykorzystanie wszystkich właściwości.
- Nie można ustawić daty względem zmiennej.
- Zmiana zmiennej na właściwość to a breaking change.
To wstyd, że istnieje tak wiele bezsensownego tarcia między zmiennymi a właściwościami; przez większość czasu robią dokładnie to samo. Kevin Dente zaproponował trochę nowej składni, która dałaby nam najlepsze z obu światów: jeżeli różnica między zmienną i mienia jest taki stały problem, zastanawiam
public property int Name;
Jeśli jednak bardziej radykalne rozwiązanie jest w porządku. Czy nie moglibyśmy całkowicie odrzucić zmiennych na korzyść nieruchomości? Czy właściwości nie robią dokładnie tego samego, co zmienne, ale mają lepszą kontrolę nad widocznością?
Użycie właściwości sprawia, że kod jest bardziej zorientowany na obiekt. Udostępniając zmienne składowe publicznie, ujawniasz swoją implementację.
zobaczyć także ten link z C# 's Programming Guide
Zmiana pola do właściwości w przyszłości jest uważany za łamanie zmiana. Pola są uważane za szczegóły implementacji klas, a ich publiczne ujawnienie łamie hermetyzację.
Jest to zmiana przełamująca tylko wtedy, gdy kod wywołujący nie może zostać zrekompilowany, przez większość czasu posiadasz kod wywołujący i jest on kompilowany przez ten sam system kompilacji. W związku z tym nie stanowi to problemu dla większości stron z zewnątrz zespołu platformy .NET. –
@Ian Ringrose: Nie jest też całkowicie kompatybilny ze źródłami. Na przykład twój kod może zrobić 'ref obj.MyField'. Nie możesz zmienić 'MyField' na' MyProperty' bez zmiany źródła. –
@Ian: To przełomowa zmiana - http://msdn.microsoft.com/en-us/library/ms182141(VS.80).aspx – Cerebrus
Jeśli pracujesz w zamkniętym środowisku - nie tworzysz pakietu SDK, wszystkie klasy są używane w ramach tego samego projektu - nie ma żadnej różnicy.
Zwykłym argumentem jest to, że "w przyszłości może zajść potrzeba sprawdzenia wartości, aby łatwiej było z właściwościami". W ogóle go nie kupuję.
Korzystanie z pól publicznych jest bardziej czytelne, mniej dekoracyjne i łatwiejsze w użyciu.
"Łatwiejszy w użyciu?", Jak to możliwe? –
Tak.
Weź pod uwagę publiczny varibale, który ma teraz ciąg znaków, możesz go po prostu ustawić. Jeśli jednak zdecydujesz, że ta publiczna zmienna powinna zawierać obiekt, który powinien zostać zainicjalizowany za pomocą ciągu znaków, musisz zmienić cały kod przy użyciu oryginalnego obiektu. Ale gdybyś użył setera, musiałbyś tylko zmienić ustawiacz, aby zainicjować obiekt za pomocą podanego łańcucha.
Można również chronić dostęp do zapisu i zezwalać na odczyt z właściwością:
public int Version { get; private set; }
To właściwie nie kompiluje. Myślę, że masz na myśli: 'public int Version {get; prywatny zestaw; } ' –
w pigułce:
- można kontrolować acces (tylko do odczytu,
do zapisu, odczytu/zapisu) - Możesz zweryfikować wartości, ustawiając właściwość (sprawdź zero itd.)
- Możesz wykonaj dodatkowe przetwarzanie, , takie jak leniwy inicjowanie
- Możesz zmienić podstawową implementację . Na przykład, właściwość może być teraz wspierana przez zmienną członka , ale można ją zmienić , aby była ona wspierana przez wiersz DB bez utraty kodu użytkownika przez .
- 1. Konwencja nazewnictwa dla zmiennych publicznych i prywatnych?
- 2. Używanie zmiennych dla właściwości CSS w Sassie
- 3. __wspólnotowy odpowiednik dla metod publicznych
- 4. Dlaczego nie mogę ustawić właściwości zmiennych iteracyjnych w pętli foreach?
- 5. Błąd łącza podczas deklarowania publicznych zmiennych statycznych w C++
- 6. Logback nie może rozpoznać substytucji zmiennych dla właściwości scanPeriod
- 7. utworzyć obiekt przy użyciu zmiennych dla nazwy właściwości
- 8. Dostęp do publicznych metod i właściwości wewnątrz Delphi BPL
- 9. Dlaczego w takim przypadku powinienem preferować HTML5 do HTML4?
- 10. Git rebase/merge dla publicznych wydań
- 11. Szybkie tworzenie właściwości C# ze zmiennych
- 12. Kiedy używać zmiennych środowiskowych a właściwości systemu?
- 13. Kiedy powinieneś preferować ReBuild zamiast Build?
- 14. Wiosna Konwencja Boot dla zmiennych
- 15. Czy powinienem preferować MonadUnliftIO lub MonadMask dla funkcji bracketingu?
- 16. Wartości domyślne zmiennych instancji i zmiennych lokalnych
- 17. Metody korzystające z prywatnych członków lub publicznych akcesorów
- 18. Jak należy wdrażać prywatnych i publicznych członków w celu-c?
- 19. Dlaczego jquery/css wymaga "px" dla najwyższej właściwości, ale nie dla właściwości width lub height?
- 20. Dlaczego warto używać publicznych metod w obiektach JavaScript?
- 21. Sprawdzanie wartości zmiennych publicznych w programie Excel VBA - okno lokalne alternatywy
- 22. Pobieranie dla zmiennych ostatecznych
- 23. Javadoc dla zmiennych lokalnych?
- 24. Ciąg stałych publicznych?
- 25. Zamieszanie zakresów zmiennych dla pętli
- 26. Dlaczego funkcja Fsharp Interactive umożliwia przechwytywanie zmiennych zmiennych przez zamknięcia?
- 27. Dlaczego valueForKey: na UITextField zgłasza wyjątek dla właściwości UITextInputTraits?
- 28. Czy mam preferować stałe ponad definicje?
- 29. Entitymanager.flush() VS EntityManager.getTransaction(). Commit - co powinienem preferować?
- 30. Dlaczego dodawanie zmiennych lokalnych powoduje opóźnienie metody?
Skutecznie dupe http://stackoverflow.com/questions/641619/when-should-you-using-a-field-rather-than-a-property i http://stackoverflow.com/questions/379041/what-is-the-best-practice-do-używania-public-fields/379057 - między innymi. – tvanfosson