2009-07-28 15 views
52

¿Por qué tengo la advertencia del compilador¿Por qué este nombre con guión bajo no cumple con CLS?

no Identificador 'Logic.DomainObjectBase._isNew' es compatible con CLS

para el siguiente código?

public abstract class DomainObjectBase 
{ 
    protected bool _isNew; 
} 
+23

que probablemente no debería estar marcado miembros no privados con un guión de todos modos. Sé que cada uno tiene su propio estilo, pero es casi seguro que otros piensen que el campo es privado, fuera de la convención. –

+0

@EdS. ¿Qué convención? – Pharap

+0

Parece haber sido una convención de VB al mismo tiempo, también parece estar fuera de moda para C++, C#, más detalles de los que caben en este recuadro que se encuentra aquí: https://stackoverflow.com/questions/3136594/naming- convención-subrayado-en-variables-cc – MatthewMartin

Respuesta

77

Desde el Common Language Specification:

compatible con CLS compiladores de lenguaje deben seguir las reglas del anexo 7 del Informe Técnico 15 de la Norma Unicode 3.0, que regula el conjunto de caracteres que pueden comenzar y que estén comprendidos en los identificadores . Este estándar está disponible en el sitio web del Consorcio Unicode.

Si look this up:

Es decir, el primer carácter de un identificador puede ser una letra mayúscula, letra minúscula, letra TitleCase, carta de modificador, otra letra o letras y números. Los caracteres subsiguientes de un identificador pueden ser cualquiera de esos, más marcas que no estén espaciadas, marcas de combinación de espaciado, números decimales, puntuaciones de conector y códigos de formato (como la marca de izquierda a derecha). Normalmente, los códigos de formato deben filtrarse antes de almacenar o comparar identificadores.

Básicamente, no puede iniciar un identificador con un guión bajo - esto viola el cumplimiento de CLS en un campo visible (público/protegido).

+0

http://msdn.microsoft.com/en-us/library/k5645wwb(v=VS.100).aspx – JohnB

+1

¿Qué es un "número de letra"? – Kevin

+2

@ Kevin: Todos los términos en el fragmento anterior se refiere a categorías Unicode: "Letter, mayúscula", "Letter, minúscula", "Letter, TitleCase", "Letter, modificador", "Letter, otro" y "Número, carta". Los números romanos son un ejemplo de un 'número de letra'. Ver http://www.fileformat.info/info/unicode/category/Nl/list.htm – Joren

28

El líder underscore concomitante con _isNew ser visible (es decir, no privado).

+12

+1 Pero debe incluir el hecho de que el miembro es * no privado * que, junto con el subrayado inicial, hace que el nombre del miembro no sea CLS-obediente. –

1

Es el guión bajo. Vea esto article.

0

Porque el nombre del miembro de datos, _isNew, comienza con un guión bajo.

2

Un identificador que cumple con CLS no debe comenzar con un guión bajo.

7

El guión bajo provoca el problema. La práctica común es que el subrayado está reservado para campos privados. los miembros protegidos/públicos deben estar debidamente cubiertos y nombrados.

Por ejemplo:

public abstract class DomainObjectBase{ 
    private bool _isNew; 
    protected bool IsNew { get { return _isNew; } set { _isNew = value;} } 
} 

O, si desea utilizar 3.x y deshacerse del ámbito privado:

public abstract class DomainObjectBase{ 
    protected bool IsNew { get; set; } 
} 
+0

¡Gracias! Marcaría esto como la segunda mejor respuesta si pudiera. – MatthewMartin

1

El líder _ no es compatible con CLS

Microsoft StyleCop analizará su código y proporcionará enlaces a los documentos relevantes explicando por qué no cumple con CLS.

+1

Me gusta la idea de StyleCop, pero sus reglas entran en conflicto con las reglas de FxCop, el reformateador de Resharper y el reformateo de Visual Studio. – MatthewMartin

+0

StyleCop y FxCop se producen tanto por Microsoft (aunque por diferentes equipos de producto) sin embargo creo que StyleCop es el que más tarde, y por lo tanto más preferido si desea utilizar un estilo de código de "Microsoft". – Frozenskys

38

CLS compliance tiene que ver con la interoperabilidad entre los diferentes .NET idiomas. La propiedad no es compatible con CLS, porque comienza con un guión bajo y es pública (nota: se puede acceder a las propiedades protegidas en una clase pública desde fuera del ensamblaje).Aunque esto funcionará si se accede a la propiedad desde C#, puede que no se acceda desde otros lenguajes .NET que no permiten caracteres de subrayado al comienzo de los nombres de propiedad, por lo tanto, no es compatible con CLS.

que está recibiendo este error de compilación, porque en algún lugar de su código que ha marcado su ensamblaje en calidad compatible con CLS con una línea como la siguiente:

[assembly: CLSCompliant(true)] 

Visual Studio incluye esta línea en el archivo AssemblyInfo.cs cuales se puede encontrar en Propiedades en la mayoría de los proyectos.

Para solucionar este error, puede:

  1. cambiar el nombre de la propiedad (recomendado):

    protected bool isNew; 
    
  2. Establecer toda la asamblea para ser no compatible con CLS:

    [assembly: CLSCompliant(false)] 
    
  3. Agregue un atributo solo a su propiedad:

    [CLSCompliant(false)] 
    protected bool _isNew; 
    
  4. Cambie el alcance de la propiedad, para que no pueda verse fuera del ensamblaje.

    private bool _isNew; 
    
+0

Entonces, cuando tiene una propiedad pública con una variable protegida, ¿cuál es la mejor convención? –

+3

Personalmente, me gusta que todos los campos sean privados. Si necesito aumentar el alcance lo envolvería en un Property Get/Set. –

+0

@MartinBrown: Hay muchas situaciones en las que una clase tendrá una propiedad pública cuya colocador llama a un método protegido que procesa las actualizaciones, pero donde los tipos derivados podrían tener una necesidad legítima de utilizar el campo directamente y enviar actualizaciones después (por ejemplo, si una clase derivada desde un control tiene un método para cambiar su color y título, pero la base no, puede ser útil para la clase derivada cambiar ambos campos y luego llamar al método de actualización una vez). Mi inclinación sería usar "Characteristic" y "_characteristic", ya que tanto VB.NET como C# lo aceptan. ¿Qué sugieres? – supercat

Cuestiones relacionadas