Web Log di Adrian Florea

"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
posts - 440, comments - 2715, trackbacks - 3944

My Links

Archives

Post Categories

Image Galleries

.RO Blogs

.RO People

.RO Sites

Blogs

Furls

Links

vinCitori

L'underscore e la CLS Rule 4

Mi ha attirato l'attenzione un commento di Massimo Prota a questo post di Pierre. Beh, riguarda CLS, di cui vi parlerò giovedì - a sala vuota mi sa... :-)

Massimo segnalava in sostanza il fatto che in un assembly conforme al CLS non possiamo nominare gli identificatori dei campi protected con il prefisso "_" in una classe public.

Ne approfitto per aggiungere delle cose magari meno conosciute:

  • Beccare tra le 41 regole del CLS quella responsabile di questo vincolo non è immediato. Dovreste leggervi l'appendice 7 "Programming Language Identifiers" dell'"Unicode Technical Report #15" (come specificato dalla CLS Rule 4 - p. 44 del PDF del testo dello standard ECMA-335). Però lì non incontrerete alcun riferimento all'underscore. Semplicemente, l'underscore non si trova nell'elenco:

    "the first character of an identifier can be an uppercase letter, lowercase letter, titlecase letter, modifier letter, other letter, or letter number"

    che definisce l'elemento . E se "_" non si trova, non è soddisfatta la regola 4 del CLS.
  • Questo è un errore che dà il compilatore C# (l'errore CS3008). Visual Basic non lo segnala come errore e possiamo tranquillamente avere:

    ' Visual Basic .NET
    Imports System
    <
    Assembly: CLSCompliant(True)>
    Namespace VisualBasic
     
    Public Class ClsRule4
        ' OK
       
    Protected _underscorePrefixed As String
      End
    Class
    End
    Namespace

    // Visual C# .NET
    using System;
    [assembly:CLSCompliant(
    true)]
    namespace CSharp
    {
     
    public class ClsRule4: VisualBasic.ClsRule4
      {
       
    public void Foo()
        {
          Console.WriteLine(_underscorePrefixed);
        }
      }
    }

    ma non il caso simmetrico:

    // Visual C# .NET
    using System;
    [assembly:CLSCompliant(
    true)]
    namespace CSharp
    {
     
    public class ClsRule4
      {
       
    // error CS3008: Identifier 'CSharp.ClsRule4._underscorePrefixed' is not CLS-compliant
       
    protected string _underscorePrefixed;
      }
    }
     
    ' Visual Basic .NET
    Imports System
    <
    Assembly: CLSCompliant(True)>
    Namespace VisualBasic
     
    Public Class ClsRule4 : Inherits CSharp.ClsRule4
       
    Public Sub Foo()
          Console.WriteLine(_underscorePrefixed)
       
    End Sub
      End Class
    End
    Namespace
  • Guardando nei sorgenti del Rotor sono arrivato al file "clsdrec.cpp" dove, all'interno della CLSDREC::checkCLSnaming si nota la verifica non solo in base all'underscore (0x005F) ma anche al carattere (0xFF3F) che significa in Unicode "FULLWIDTH LOW LINE". Se provate invece in Visual C# .NET a dichiarare un membro che inizi con \uff3f non vi dà errore di non conformità al CLS ma:

    Invalid token '' in class, struct, or interface member declaration
    Invalid token ';' in class, struct, or interface member declaration

Massimo ha fatto anche un piccolo errore, sicuramente per la fretta del commento: ha incluso anche il camelCase nelle nomenclature non conformi al CLS.

Print | posted on domenica 28 novembre 2004 18:23 | Filed Under [ Carillon .NET CLS ]

Powered by:
Powered By Subtext Powered By ASP.NET