2009-09-17 7 views
38

Escenario típico: una clase en la que mucha gente ha trabajado. Me gustaría ordenar métodos, propiedades, etc ... en orden alfabético.¿Cómo reordenar miembros de tipo con Resharper?

Me gustaría poder hacer esto dentro de la región o globalmente en la clase.

Veo la función en Resharper para hacerlo, pero parece que no hace nada.

+0

Gracias, todo. Terminé instalando una copia de MZ Tools, que ya tengo, pero que no he usado desde 2006. Tiene la función y funcionó bien. – AngryHacker

+0

Me pasó lo mismo. Funcionó muy bien y luego simplemente se detuvo. –

Respuesta

77

Utilice la funcionalidad "Código de limpieza".

El orden de los miembros se puede configurar en las opciones de ReSharper en Idiomas, C#, Tipo Diseño de miembros. Esta es una especificación de diseño XML bien documentada que ReSharper usa al reordenar miembros.

+28

En realidad, no funciona. – Kyle

+8

@Kyle, si le dice a R # que reordene los miembros y su especificación de disposición es correcta, de hecho funciona. Ver los documentos R # para más detalles; algunos tipos (como las clases de prueba unitaria y las estructuras de interoperabilidad con atributos de disposición secuencial) no se modifican porque el orden puede ser significativo. – Lucero

+1

No veo nada sobre ordenar alfabéticamente en la especificación R #. – manu08

4

Una alternativa a considerar es Regionerate. Usamos y nos gusta ReSharper, pero Regionerate se ajusta a nuestras necesidades para crear regiones y ordenar/reorganizar los miembros. Y todo es personalizable, por supuesto.

ACTUALIZACIÓN: Empezamos a usar ReSharper's Code Cleanup para esto en su lugar.

+0

lo usamos durante aproximadamente 2 semanas, pero luego, cuando una proliferación de regiones anidadas infesta nuestro código, todos lo desechamos. Es una cuestión de gusto personal, por supuesto, pero asegúrese de que todos estén de acuerdo en cómo se va a utilizar ... – zzzuperfly

+0

@zzzuperfly: Sí, todos deben ponerse de acuerdo sobre los estándares y debe ajustar la configuración. – TrueWill

+3

si usa regiones, normalmente es un signo de que sus clases son demasiado grandes, las grandes = clases significan que tiene demasiadas responsabilidades por clase – roundcrisis

3

Dos cosas: hay una condición conocida (pero no muy documentada) en la que los condicionales de precompilación (# if DEBUG, por ejemplo) detendrán el tipo de reordenación de miembros. http://youtrack.jetbrains.com/issue/RSRP-336643#tab=Comments En otras palabras, si tiene #IF DEBUG no se volverá a ordenar.

También recientemente noté que en ReSharper 8.0.1 (y probablemente en versiones anteriores) que el botón para revertir la plantilla XML de nuevo a DEFAULT WITH REGIONS realmente no tiene ninguna declaración que incluya la agrupación #REGION. Así que tomé una plantilla amigable de StyleCop que incluye ordenar y agregué # REGION-ing a cada miembro del tipo. Si selecciona PLANTILLA PERSONALIZADA y luego pegue este XML, debería funcionar.

<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns"> 

<!-- Do not reorder COM interfaces --> 
<Pattern> 
    <Match> 
     <And Weight="100"> 
      <Kind Is="interface" /> 
      <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute" /> 
     </And> 
    </Match> 
</Pattern> 

<!-- Special formatting of NUnit test fixture --> 
<Pattern RemoveAllRegions="true"> 
    <Match> 
     <And Weight="100"> 
      <Kind Is="class" /> 
      <HasAttribute CLRName="NUnit.Framework.TestFixtureAttribute" Inherit="true" /> 
     </And> 
    </Match> 

    <!-- Setup/Teardow --> 
    <Entry> 
     <Match> 
      <And> 
       <Kind Is="method" /> 
       <Or> 
        <HasAttribute CLRName="NUnit.Framework.SetUpAttribute" Inherit="true" /> 
        <HasAttribute CLRName="NUnit.Framework.TearDownAttribute" Inherit="true" /> 
        <HasAttribute CLRName="NUnit.Framework.FixtureSetUpAttribute" Inherit="true" /> 
        <HasAttribute CLRName="NUnit.Framework.FixtureTearDownAttribute" Inherit="true" /> 
       </Or> 
      </And> 
     </Match> 
    </Entry> 
    <!-- All other members --> 
    <Entry /> 
    <!-- Test methods --> 
    <Entry> 
     <Match> 
      <And Weight="100"> 
       <Kind Is="method" /> 
       <HasAttribute CLRName="NUnit.Framework.TestAttribute" Inherit="false" /> 
      </And> 
     </Match> 
     <Sort> 
      <Name /> 
     </Sort> 
    </Entry> 
</Pattern> 

<!-- Default pattern --> 


<Pattern RemoveAllRegions="false"> 
    <!-- Delegates --> 
    <Entry> 
     <Match> 
      <And Weight="100"> 
       <Access Is="public" /> 
       <Kind Is="delegate" /> 
      </And> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Name /> 
     </Sort> 
     <Group Region="Delegates" /> 
    </Entry> 


    <!-- Fields and constants --> 
    <Entry> 
     <Match> 
      <Or> 
       <Kind Is="field" /> 
       <Kind Is="constant" /> 
      </Or> 
     </Match> 

     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Kind Order="constant" /> 
      <Readonly /> 
      <Static /> 
      <Name /> 
     </Sort> 
     <Group Region="Fields" /> 
    </Entry> 

    <!-- Enums --> 
    <Entry> 
     <Match> 
      <Kind Is="enum" /> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Name /> 
     </Sort> 
     <Group Region="Enums" /> 
    </Entry> 

    <!-- Constructors. Place static one first --> 
    <Entry> 
     <Match> 
      <Kind Is="constructor" /> 
     </Match> 
     <Sort> 
      <Static /> 
      <Access Order="public internal protected-internal protected private" /> 
     </Sort> 
     <Group Region="Constructors" /> 
    </Entry> 

    <!-- Destructors. Place static one first --> 
    <Entry> 
     <Match> 
      <Kind Is="destructor" /> 
     </Match> 
     <Sort> 
      <Static /> 
      <Access Order="public internal protected-internal protected private" /> 
     </Sort> 
     <Group Region="Destructors" /> 
    </Entry> 


    <!-- Events --> 
    <Entry> 
     <Match> 
      <Kind Is="event" /> 
     </Match> 

     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Name /> 
     </Sort> 
     <Group Region="Events" /> 
    </Entry> 

    <!-- Properties --> 
    <Entry> 
     <Match> 
      <And> 
       <Kind Is="property" /> 
       <Not> 
        <Kind Is="indexer" /> 
       </Not> 
      </And> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Properties" /> 
    </Entry> 

    <!-- Indexers --> 
    <Entry> 
     <Match> 
      <Kind Is="indexer" /> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Indexers" /> 
    </Entry> 

    <!-- Methods --> 
    <Entry> 
     <Match> 
      <And> 
       <Or> 
        <Kind Is="method" /> 
        <Kind Is="operator" /> 
        <HandlesEvent /> 
       </Or> 
       <Not> 
        <Kind Is="destructor" /> 
       </Not> 
      </And> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Methods" /> 
    </Entry> 

    <!-- all other members --> 
    <Entry /> 

    <!-- nested types --> 
    <Entry> 
     <Match> 
      <Kind Is="type" /> 
     </Match> 
     <Sort> 
      <Access Order="public internal protected-internal protected private" /> 
      <Static /> 
      <Abstract /> 
      <Virtual /> 
      <Override /> 
      <Name /> 
     </Sort> 
     <Group Region="Nested Types" /> 
    </Entry> 
</Pattern> 

34

Para el beneficio de la gente, como yo, que aterrizó en esta cuestión a través de una búsqueda en Internet, pero se ha encontrado que el detalle de la cuestión no era lo que esperaban, que le gustaría sepa que puede mover miembros individuales arriba y abajo dentro del archivo manteniendo presionadas las teclas Ctrl-Alt-Shift y luego presionando las flechas hacia arriba o hacia abajo.

(Obviamente eso no está pidiendo la disposición automatizada por orden alfabético en el cuerpo de la pregunta, pero era la respuesta que esperaba que iba a encontrar a la pregunta del título.)

+0

Esta es información útil que puede ser útil para las personas que tropiezan con esta pregunta. Encontré lo que estaba buscando en la publicación original con la respuesta más votada, pero tu respuesta fue provista con un atajo útil que se puede usar sobre la marcha. –

+1

Debo añadir que puede hacer clic en ctrl + m, ctrl + 0 para contraer todos los métodos. A continuación, puede mover bloques de métodos como se describe arriba. – jwize

+0

Gracias, esto fue lo que vine a buscar aquí. – NJH

0

Desde Visual Studio menú;

ReSharper> Opciones> Comportamiento medio ambiente> IntelliSense> Finalización> Ordenar elementos (en orden alfabético)

33

clasificación no está activado por defecto. Puede activarlo mediante la apertura de las opciones ReSharper y luego ir aquí:

enter image description here

+0

parece que no hay ninguna opción para reordenar las clases en el mismo archivo por nombre ... ¿sabes si eso es posible? – montelof

+3

No lo sé. Nunca coloco varias clases en el mismo archivo. – jgauffin

+0

¡Gracias! Exactamente lo que estaba buscando. Esto funcionó muy bien. – aoakeson

0

Si está reordenando los parámetros sobre los métodos específicos, se puede utilizar el Refactor> Cambiar Firma si el cursor está en un nombre de método. Yo uso los atajos IntelliJ, así que para mí, el comando es Ctrl + Shift + R seguido de Ctrl + F6.

Refactor context menu

Después de hacerlo, un cuadro de diálogo pop-up que le permite reordenar los parámetros del método. Incluso refactorizará cualquier implementación de una interfaz.

Cuestiones relacionadas