C # C # código de base de las Notas (a)

Sobre los problemas de optimización de código, incluso antes de que lo introdujo a contenido relevante. Aquí está el C # Algunas consideraciones de optimización de código, para referencia.

En primer lugar, en lugar de utilizar el atributo campos accesibles

1, los datos de .NET vinculante sólo es compatible con el enlace de datos, puede aprovechar los beneficios de la utilización de enlace de datos de propiedad;

2 y obtenga acceso a la propiedad en alta estima y de cierre del paquete se puede utilizar para agregar multithreading apoyo.

Dos, de sólo lectura (constantes de tiempo de ejecución) y const (constante de tiempo de compilación)

1, const solamente para los tipos de primitivas, enumeraciones, cuerdas, de sólo lectura puede ser cualquier tipo;

2, const en las constantes de tiempo de compilación será reemplazado por el hormigón, por lo que si se utiliza la const y readonly dos tipos de valores señalados en el mismo tiempo, los cambios de sólo lectura de nuevo van a cambiar el diseño de la intención original, que es volver a compilar el programa de necesidades para el cambio listo para volver a referenciar el nuevo valor constante.

3, const sólo lectura más alta que la eficiencia, pero perdió la flexibilidad de aplicación.

Tres, que es y como se

1, tanto en el tipo de tiempo de ejecución de la conversión, AS operador sólo puede usarse en el tipo de referencia, y es un tipo de referencia y el valor puede ser utilizado;

2, la práctica habitual se determina por el tipo de IS, entonces eligen utilizar tan fuerte o de conversión del operador (definido por la conversión operater) se realizan selectivamente.

Cuatro, en lugar de ConditionalAttribute #if #endif condicional compilación

1, el nivel de ConditionalAttribute sólo para el método, tal como la adición de otros tipos, los atributos son válidos; la #endif #if no tan limitada;

2, las condiciones ConditionalAttribute pueden añadirse o una pluralidad de operación compilado (OR), y se pueden añadir con #endif #if (la Y) [tal como se define en otro símbolo completamente separado];

3, ConditioanlAttribute definición se puede colocar en un proceso separado, de manera que el programa sea más flexible.

En quinto lugar, proporcionar un método ToString ()

1, puede ser más fácil manera de proporcionar información detallada;

2, utilizando IFormatter.ToString () método proporciona más flexibilidad de personalizar, y si las interfaces ICustomFormatter IFormatProvider añadido personalizarse mensaje de salida más significativo.

Diferencia En sexto lugar, los tipos de valor y de referencia

1, no es compatible tipo de valor de múltiples estados, adecuado para almacenar la operación de los datos de aplicación, y apoya referencia de múltiples estados para la definición del comportamiento de la aplicación;

2, que se define como un valor para los tipos de matriz puede mejorar significativamente el rendimiento del programa;

3, el valor del tipo con menos fragmentación de la memoria de la pila, y la basura tiempo de acceso a memoria indirecta, que devuelve la copia proceso se realiza de manera que se evite el contacto con el exterior de la estructura interna;

4, el valor del tipo usado en el siguiente escenario: el tipo de papel se utiliza principalmente para el almacenamiento de datos; acceso completo a las propiedades de interfaz común están definidos por algunos miembros de datos; comportamiento no polimórfica, nunca subclase.

Siete, el valor del tipo implementado como una especie de constante y atómica como sea posible

1, para hacer que nuestro código sea más fácil de escribir y mantener;

2 tres estrategias, de inicialización constantes: la configuración; método de fábrica; una estructura secundaria variable (tal como StringBuilder).

Ocho, para garantizar el estado efectivo 0 vale

1, el valor predeterminado tipo debe ser 0;

2, 0 tipo de enumeración no debe ser "estado inactivo"; en el valor FlagsAttribute es 0 garantizar Estado eficaz;

3, la cadena vacía puede devolver una cadena nula de String.Empty;

Una variedad de Nine, igual representación de la relación entre el juez

1, ReferenceEquals () igual a la determinación de la referencia, dos referencia a rendimientos verdaderos sólo cuando un mismo objeto;

2, la estática método equals () determina entonces un valor de referencia de determinación de tipo avanzada;

3, se puede utilizar cuando se usan los "semántica de valor" una referencia para determinar el método de tipo de Iguales de anulación ();

Método 4, reescribiendo equals () también debe reemplazar el método cuando GetHashCode (), mientras que proporciona operater == operación ().

Defecto X. apreciado GetHashCode () método

1, GetHashCode () aplicación basada en el conjunto valor hash sólo se define hash de clave, como el diccionario o HashTable;

2, GetHashCode () debe seguir las reglas de las respectivas tres: dos objetos iguales debe devolver el mismo código hash, un ejemplo debe ser invariante; función de hash debe resultar en una distribución aleatoria de todos los números enteros;

XI, uso prioritario bucle foreach

1, bucle foreach puede eliminar el compilador para comprobar si hay un límite de array;

2, variable de bucle foreach es de sólo lectura, y no hay una conversión explícita, se produce una excepción cuando un tipo de objeto de una colección de objetos no es correcto;

3, en uso necesidad de establecer foreach: un método de propiedad pública GetEnumberator (); IEnumberable implementa explícitamente la interfaz; implementa la interfaz IEnumerator;

4, foreach puede llevar los beneficios de la gestión de recursos, porque se puede tratar usando el compilador optimizado puede determinar si la interfaz IDisposable ... finally;

campo predeterminado XII inicialización de asignación superiores

1, el campo de la vida se pondrá por defecto tipo de valor se inicializa a 0, el tipo de referencia de inicialización es nulo;

2, una pluralidad de veces para la misma inicialización de objetos es muy ineficiente;

3, la inicialización del campo en el constructor de facilitar el manejo de excepciones.

Trece, usando un constructor estático para inicializar miembro estático

1, el constructor estático se ejecutarán antes cualquiera de los métodos de una clase, o un atributo de Acceso Variable;

2, los campos estáticos también se ejecutarán antes de que los constructores estáticos y constructores estáticos en favor de manejo de excepciones.

En cuarto lugar, el uso de la estructura de la cadena (en el .NET 4,0 ha resuelto este problema con el parámetro opcional)

1, con este trabajo de inicialización a otra estructura, una base con una llamada de clase base constructor;

2, un ejemplo de la secuencia de funcionamiento del tipo que: todos los campos estáticos se ponen a 0; se realiza la inicialización de campo estático; la realización de constructor de la clase de base estática; ejecutar el tipo actual de constructores estáticos;

Todos los campos de instancia establecidos a 0; ejecutar los inicializadores campo de instancia; realizan la instancia apropiada del constructor de la clase base; ejecutar la instancia actual de los constructores de tipos.

En quinto lugar, el uso de uso y try / finally para limpiar los recursos

interfaz IDisposable con el método Dispose () de la GC.SuppressFinalize () no puede notificar a las lleva a cabo una operación de recolector de basura finalización.

XVI para reducir al mínimo la basura de memoria

1, la distribución y la destrucción de un objeto a ser gastado en tiempo de procesador adicional;

2, para reducir el número de técnicas de asignación: variables locales comúnmente utilizados para mejorar el campo; una clase, para el almacenamiento de objetos Singleton casos comunes de un tipo particular de expresión.

3, un complicado StringBuilder manipulación de cadenas.

XVII minimizar el boxeo y unboxing

1, para centrarse en un tipo de conversión implícita System.Object, mientras que el tipo de valor no debe ser sustituido tipo System.Object;

2, en lugar de utilizar la interfaz de evitar el tipo de envase, procedentes del tipo de valor de la interfaz, a continuación, llamando a las interfaces miembros.

XVIII lograr el patrón Desechar estándar

1, el uso de los recursos no de memoria, debe tener un terminador, después de que el recolector de basura no termina en la realización de su objeto de memoria se añadirá a alcanzar un objeto terminador al final de la cola, a continuación, el recolector de basura se iniciará un nuevo hilo Fin funcionar con estos objetos, esta es la manera de ponerse a la defensiva, porque si se olvida de llamar a Dispose () método, el recolector de basura siempre se llamará terminador método, por lo que puede evitar que los recursos de memoria no administrados no ser liberado para causar un problema de pérdida de memoria; l

2, el método para hacer el trabajo en cuatro áreas IDisposable.Dispose (): liberar todos los recursos no administrados, para liberar todos los recursos administrados; si va a poner una bandera para indicar el estado ha sido ejecutado Dispose (); GC.SuppressFinalize llamada (esto ) desagrupar extremo objetos de operación;

3, es una necesidad de añadir un métodos virtuales tipo polimórfico Desechar protegido (), para liberar sus clases derivadas anulan este objeto se consigue por un método;

4, en el tipo de interfaz necesidad IDisoposable, incluso si no es necesario un terminador también deberá aplicar un terminador.

En noveno lugar, definir e implementar un tipo de interfaz es mejor que la herencia

1, los tipos no relacionados pueden trabajar juntos para lograr una interfaz común, y la interfaz es más fácil de lograr que la herencia;

2, la interfaz es estable, será un conjunto empaquetado de funciones en una interfaz, implementado como otro tipo de contrato, y la clase de base se puede extender en el tiempo.

XX, la interfaz de discernimiento y anular el método virtual

1, una interfaz implementado en la clase base, la necesidad clase derivada de ocultar el uso de nuevos métodos de la clase base;

2, la clase base pueden declararse como un método virtual interfaz y, a continuación, implementado en la clase derivada.

devolución de llamada delegados uso XXI expresado

1, el propio objeto delegado no proporciona ninguna excepción cogido, por lo que cualquier invocación delegado de multidifusión va a terminar toda la cadena de llamada;

2, encargado por mostrar cada llamada de destino en la cadena de delegación evitarse vuelve delegado de multidifusión sólo la salida del último delegado.

XXII, utilizando eventos define las interfaces externas

1, debe ser declarada como un evento común, dejar que el compilador de crear y agregar método renmove para nosotros;

2, el uso de contenedores System.ComponentModel.EventHandlerList para almacenar cada controlador de eventos, cuando un gran número de eventos incluidos en los tipos puede utilizar para ocultar la complejidad de todos los eventos.

Xxiii, evitar devolver una referencia al objeto de clase dentro de

1, debido al objeto tipo de valor Access crea una copia del objeto, por lo que la definición de un tipo de valor de la propiedad no va a cambiar el estado interno del tipo de objeto;

2, la constante de cambio de estado del tipo de objeto se pueden evitar;

3 definir la interfaz para restringir el acceso a un subconjunto del objeto de minimizar el daño al estado interno;

4, la definición de un objeto envoltorio para restringir el acceso a otro objeto;

5, es deseable para cambiar el modo Observador código de cliente elementos de datos pueden implementarse interna, de modo que el objeto puede ser verificada o cambiado correspondientemente.

programación declarativa XXIV de la programación imperativa

Para evitar la posibilidad de errores en la pluralidad de algoritmos similares de código clara y legible y proporcionar escrito a mano.

XXV, en la medida de lo posible el tipo implementado como una secuencia de tipo

1, no los controles, tipo o forma de representación ventana de interfaz de usuario, el tipo de soporte se debe serializar;

2, cuando la adición de deserialización atributo puede NonSerializedAttribute () para cargar los valores predeterminados por la aplicación de la OnDeserialization IDeserializationCallback;

3, el control de versión se puede utilizar para control de interfaz flexible ISerializable, la serialización mientras que proporciona un constructor para inicializar el objeto de la corriente de datos, en la implementación, requiere la anormalidad permiso SerializationFormatter.

4. Si es necesario crear una clase derivada tendrá que proporcionar un método para la vinculación de las clases derivadas a su uso. Shenzhen sustituto eléctrico 13802269370   sustituto micro 13802269370   Beijing micro sustituto 13802269370

Supongo que te gusta

Origin www.cnblogs.com/bbc2020/p/12457414.html
Recomendado
Clasificación