Les lignes directrices sont pas des règles strictes et rapides.
Ces lignes directrices sont destinées aux dynamiques des objets, et, en réalité, sont en train de dire que les propriétés ne doivent pas muter un objet. DateTime.Maintenant, est une propriété statique, de sorte que l'appelant n'a pas muter un objet. C'est aussi que refléter l'état naturel de l'heure, de ne pas changer quoi que ce soit. C'est la simple observation d'une évolution constante de la minuterie.
Donc, le fait de ne pas créer des propriétés qui changent l'état de l'objet. Faire créer des propriétés que le simple fait d'observer l'état de l'objet (même si les changements d'état de l'extérieur).
Comme autre exemple, regardons la longueur d'une chaîne. C'est une propriété, mais la longueur de la chaîne peut changer d'une invocation à l'invocation si quelque chose d'autre de modifier la chaîne de l'extérieur. C'est fondamentalement ce qui se passe, le compte à rebours est en cours de modification à l'extérieur, Maintenant, juste reflète son état actuel seulement comme une chaîne de caractères.Longueur ou de tout autre bien.
8 votes
La (date)heure n'est qu'une illusion : tout se passe maintenant. C'est donc une propriété :)
3 votes
Hehe... relativement parlant, la valeur ne change jamais ; elle est toujours
Now
. Si la structure contenait des nombres différents dans ses champs, alors la valeur changerait par rapport àNow
! Ach... cerveau... douleur...1 votes
@Andrew : Donc devrait-il retourner un
Func<DateTime>
? :)6 votes
J'ai écrit un programme qui appelle
DateTime.Now
dans une boucle en attendant qu'il change. J'ai pu l'appeler plus de 16 000 fois de suite sans qu'il ne change. Utilisation deUtcNow
J'ai reçu plus d'un million d'appels successifs avant que ça ne change. Je pense que c'est suffisant pour en faire une propriété.0 votes
@Gabe - C'est une note très intéressante à ce sujet, un sujet déjà assez ésotérique. Il a fallu pas mal de temps, relativement parlant, avant que la valeur de cette propriété statique ne soit modifiée en externe. Je dirais définitivement que cela compte autant que n'importe quelle autre propriété en général, comme ne changeant pas entre les appels. :p
2 votes
@Gebe , je vous propose de passer un accord : "Si l'appel de la méthode 42 fois de suite renvoie la même valeur - elle peut être convertie en propriété."
0 votes
Je suis avec l'OP. La plupart des réponses tentent de rationaliser des raisons faibles, mais pourquoi ne pas vérifier ce qui se passe dans d'autres langages : Java Date.now() Delphi fonction maintenant : TDateTime ; , Rust Utc::now() ; , C++ std::chrono::system_clock::now() ; . En fait, il y a plus de raisons d'avoir une fonction qu'une propriété ici. L'argument "déterministe" ou tout autre argument doit s'appliquer à tout langage, pas seulement au C#. Cela dit, le C# est mon langage préféré, mais de nombreuses propriétés DateTime seraient mieux adaptées en tant que méthodes.