Czy właściwości w C# powinny wykonywać dużo pracy?

Czy właściwości w C# powinny wykonywać dużo pracy?

Zanim zastanowisz się, jak drogie powinny być nieruchomości, radzę zastanowić się, czy koncepcja, którą modelujesz, najlepiej przedstawiać jako „własność czegoś”. Właściwości istnieją w języku, aby wyrazić przypisanie innych jednostek - jeśli SomeValue nie jest logicznie właściwością typu, do którego należy, należy zamiast tego rozważyć użycie metod pobierających/ustawiających.

Mając to, pomaga to, aby nieruchomości były niedrogie, gdy tylko jest to możliwe. Większość programistów oczekuje, że właściwości będą wydajnym opakowaniem wokół pewnego wewnętrznego stanu typu, do którego należą. Naruszenie tego oczekiwania utrudnia programistom pisanie dobrze działającego kodu, który korzysta z tej właściwości. Na przykład, jeśli właściwość jest używana jako warunek for pętla zostanie oceniona przy każdej iteracji - jeśli jest droga... cóż, może być źle.

Właściwości są również często dostępne w debugerze — nie chcesz, aby właściwości wykonywały kosztowną logikę, ponieważ może to uniemożliwić debugowanie. Pobieracze właściwości, które wykonują operacje z efektami ubocznymi (na przykład odpytywanie bazy danych) są generalnie również złą praktyką, ponieważ mogą wprowadzać błędy heisenbug podczas sprawdzania zachowania aplikacji w debugerze.

Możesz również przeczytać tę odpowiedź, która zawiera dobre ogólne wytyczne dotyczące projektowania nieruchomości. Radziłbym również przeczytać Wybieranie między właściwościami i metodami w wytycznych projektowych .NET w witrynie MSDN.

Czasami sensowne jest utworzenie właściwości, która jest tylko do odczytu (bez ustawiania), ale gdy istnieje jedna lub więcej oddzielnych metod, które ustawiają stan wewnętrzny związany z tą właściwością. To, czy użyć tego idiomu, zależy od tego, czy operacje na twoim obiekcie są ujawniane semantycznie jako "zmiana stanu" lub „wykonywanie aktywności” . Kiedy jest to drugie, zwykle używam metod (zamiast ustawiaczy właściwości), aby wyrazić to zachowanie.


Ogólna zasada jest taka, że ​​wywołanie właściwości nie powinno być drogie. Jeśli są drogie, zamień je w getter. Nie zawsze można tego przestrzegać, zdecydowanie musisz użyć osądu.


Dokładna ilość zbyt dużo pracy jest dyskusyjna. Najlepszą odpowiedzią jest to, że nieruchomości powinny raczej wykonywać mniej pracy niż więcej :)

Jedna rzecz, której Get Properties nie powinien nigdy robić jest zmiana stanu obiektu.