Cómo nombrar archivos fuente C # para clases genéricas

Intento seguir las convenciones generales de nomenclatura, como las que se describen en las Pautas de diseño para desarrollar bibliotecas de clases . Puse cada tipo en su propio archivo fuente (y las clases parciales se dividirán en varios archivos como se describe en la pregunta Convenciones de denominación para archivos de clases parciales ), utilizando el nombre del tipo como el nombre del archivo.

Ejemplos:

namespace Demo.Bla // project { enum FlowDirection { } // in file FlowDirection.cs class LayoutManager { } // in file LayoutManager.cs } namespace Demo.Bla.LayoutControllers // folder LayoutControllers in project { class StackPanelLayoutController { } // in file LayoutControllers/StackPanelLayoutController } 

Pero no estoy seguro de haber encontrado una forma inteligente de nombrar los archivos fuente que contienen clases genéricas. Digamos que tengo las siguientes clases, por ejemplo:

 namespace Demo.Bla.Collections // folder Collections { class Map { } // in file Map.cs (obviously) class Bag { } // in file Bag.cs (obviously) class Bag : Bag { } // also in file Bag.cs ??? } 

¿Debo incluir el código de las clases Bag no genéricas y genéricas en el mismo archivo Bag.cs ? ¿Cuáles son tus hábitos?

Creo que la solución común a este problema es nombrar el archivo así:

 {ClassName}`{NumberOfGenericParameters} 

Esto le daría este nombre de archivo:

 Bag.cs and Bag`1.cs 

Esta es la forma en que Microsoft maneja este problema en frameworks como Asp.net Mvc.

He visto algunas bibliotecas usando

 Bag.cs Bag`1.cs Bag`2.cs 

ya que esto es lo que Type.Name .

Quiero ser más descriptivo con los parámetros de tipo, así que últimamente tiendo a usar

 Bag.cs Bag{T}.cs Bag{TKey, TValue}.cs 

Este es un formato que también es compatible con los comentarios XML.

 ///  /// ... /// Uses the  class. ///  

Por lo general, si tengo varios tipos “sobrecargados” por el número de parámetros de tipo, es porque uno deriva del otro o uno se usa para crear el otro. Simplemente los puse en el mismo archivo.

Una opción alternativa sería dividirlos en diferentes archivos, hacer que un archivo sea el “primario” y los otros “dependan” de él en el archivo de comstackción, según la pregunta de clase parcial a la que se vinculó en la pregunta.

De esta forma, podría terminar con un enlace visual en Visual Studio, pero una clase por archivo para que sea más fácil trabajar con ellos.

En el repository CoreFX GitHub , Microsoft está siguiendo la convención de retroceso tilde descrita en la respuesta de Matthias Jakobsson :

enter image description here

Así que básicamente:

 class ImmutableArray { } // ImmutableArray.cs class ImmutableArray { } // ImmutableArray`1.cs ... class ImmutableDictionary { } // ImmutableDictionary`2.cs 

Y para las clases definidas dentro de otras clases, el nombre está compuesto por la clase externa seguida por + y por el nombre de la clase interna ( Outer+Inner.cs ):

 partial class ImmutableArray // ImmutableArray`1+Builder.cs { class Builder { } } 

Agrego un sufijo ‘T’ a los nombres de mis clases genéricas.

 class Bag { } // in file Bag.cs class BagT : Bag { } // in file BagT.cs class BagInputs : BagT // in file BagInputs.cs 

Tu preguntaste,

¿Debo incluir el código de las clases Bag no genéricas y genéricas en el mismo archivo Bag.cs? ¿Cuáles son tus hábitos?

La convención mía anterior no es estándar; Debo aclarar que estaba respondiendo “cuáles son mis hábitos” y no necesariamente “lo que debes hacer”.