2012-02-06 10 views
9

En CLR via CSharp capítulo 10 "Propiedades" Jeff Richter escribe:¿Por qué la ejecución de propiedades es más lenta que la ejecución de campo o método?

método

Una propiedad puede tomar mucho tiempo para su ejecución; el acceso de campo siempre se completa inmediatamente. Una razón común para usar propiedades es realizar la sincronización de subprocesos, que puede detener el subproceso para siempre, y, por lo tanto, no se debe usar una propiedad si se requiere la sincronización de subprocesos . En esa situación, se prefiere un método. Además, si se puede acceder remotamente a su clase (por ejemplo, su clase se deriva de System.MarshalByRefObject), llamar al método de la propiedad será muy lento y, por lo tanto, se prefiere un método a una propiedad . En mi opinión, las clases derivadas de MarshalByRefObject nunca deben usar propiedades.

¿Es este el caso incluso si la propiedad está definida para simplemente devolver el campo privado? ¿Por qué se prefiere un método en sincronización? y ¿por qué se prefiere un método en el escenario MarshalByRefObject?

Para aclarar mi pregunta:
Jeff parece estar haciendo una declaración general de que las propiedades no son aconsejables, y que los métodos son preferibles en esos 2 escenarios. como señaló Joe White, las propiedades pueden tener un código arbitrario. Pero los métodos pueden ejecutar el mismo código arbitrario. Esa es la parte con la que estoy teniendo problemas. ¿Existe alguna ventaja en el uso de métodos sobre las propiedades (dado que se usa el mismo código) para la sincronización o la clasificación, o simplemente tiene un problema con la convención del lenguaje?

Respuesta

9

Creo que señala que, como una propiedad puede ejecutar cualquier código arbitrario, el código de llamada no debe suponer que terminará inmediatamente.

Si todo lo que hace la propiedad es devolver un campo, entonces su cuerpo de método estará en línea con el compilador JIT y será tan rápido como un acceso de campo. Entonces no es que las propiedades sean de alguna manera más lentas; es que son cajas negras. Si no sabe cómo se implementa una propiedad, no puede hacer suposiciones acerca de cómo volver rápidamente.

(Dicho esto, hacer una propiedad lenta sería una clara violación del .NET Framework Design Guidelines, específicamente este: "Usar un método, en lugar de una propiedad, [si la] operación es en órdenes de magnitud más lenta que un campo establecido sería ".)

En cuanto a su sugerencia de utilizar métodos en su lugar, no puedo tener ningún sentido de eso. Las propiedades son métodos: el getter de propiedad es un método (normalmente llamado get_PropertyName) y el setter de propiedad es un método (set_PropertyName) y el código que lee la propiedad se compila al código que realiza una llamada a get_PropertyName. No hay nada especial que haga que una propiedad sea más lenta que un método.

+7

El punto de Jeff es que una llamada al método "GetBlah" * se comunica con el lector * "esto podría ser lento" y una propiedad "Blah" comunica "esto es casi seguro rápido". Entonces, si vas a hacer algo lento, hazlo un método. No estoy completamente * de acuerdo con este consejo; por ejemplo, a menudo hago que las propiedades tengan lentos * improbables casos peores * pero tengan un excelente rendimiento * amortizado *. Pero el consejo de Jeff es definitivamente un buen punto de partida; desviarse de ella una vez que sepa lo que está haciendo. –

5

Creo que el punto es que el acceso a la propiedad se ve como un acceso de campo, por lo que las personas no esperan nada inusual.

Si tiene una propiedad que puede llevar mucho tiempo, debe volver a escribirla en un método. No hará que su código funcione mejor, pero será más claro que podría llevar mucho tiempo.

En lo que respecta al rendimiento, no hay diferencia entre el acceso a la propiedad y la llamada al método.En realidad, el acceso a la propiedad es solo una llamada a un método.

+0

bien ... dijo explícitamente que "llamar al método de propiedad será muy lento, y por lo tanto, se prefiere un método a una propiedad". así que no se trata solo de apariencias ... al menos según Jeff ... –

+1

Llamar a la propiedad será lento, y la gente no espera que las propiedades sean lentas. Llamar a un método será igualmente lento, pero la gente espera que algunos métodos sean lentos. – svick

3

Un método no es más rápido que una propiedad, pero no se espera que un método sea tan rápido como una propiedad. Por lo tanto, se prefiere el método para dejar en claro que podría llevar algo de tiempo (debido a la sincronización del hilo en este caso).

Los campos no se "ejecutan" en absoluto. Acceder a un campo es acceder directamente a la memoria.

+0

El acceso a un campo de instancia es * indirectamente * accediendo a la memoria, porque primero tiene que ubicar el * receptor * en la memoria. –

+0

@Eric: sí, claro, quiero decir que está accediendo a la memoria, no está ejecutando el código. –

Cuestiones relacionadas