2012-03-21 9 views
5

Come autore di una libreria OSS, ho sempre cercato di rendere CLS compatibile. Ma MS non lo rende facile. Spesso ti mettono in situazioni di catch-22, come ad esempio:Limitazioni pratiche con assiemi non contrassegnati come conformi a CLS?

  • Non è possibile avere una variabile protetta che differisce solo nel caso della proprietà pubblica.
  • Non è possibile avere variabili protette o pubbliche che iniziano con un carattere di sottolineatura o "m_".
  • Se si desidera rendere una classe realmente estendibile, è spesso necessario avere variabili protette che corrispondono alle proprietà pubbliche. La tua uscita meno brutta è quella di aggiungere un suffisso alla variabile, come "Var" o "Valore". È brutto e inaccettabile per me. Mi piace il codice pulito.

Non conosco linguaggi .NET che non supportano variabili che iniziano in un carattere di sottolineatura, e li ho usati in molti posti in cui la variabile deve essere visibile alle sottoclassi.

Sono stanco degli avvertimenti e sto pianificando di disattivare la conformità CLS a livello di assembly sulle mie librerie 30+ C#.

Sono presenti problemi effettivi con la disattivazione della conformità CLS nelle librerie? Qualsiasi reale problemi con questo?

Microsoft ha rilasciato una guida unheedable sul software per decenni, con meno del 5% di esso che è valsa la pena di byte è stato codificato in. Non riesco a trovare alcuna prova che questo migliori pratiche ha alcun effetto reale su qualsiasi cosa.

Ma, per fare attenzione, sto controllando.

E no, questo non è un duplicato del inverso di questa domanda: Any reason not to mark a DLL as CLSCompliant?

Sto cercando i risultati effettivi e gli effetti qui, non il consiglio di un tirocinante MS.

Ad esempio, se IronPython, IronRuby o F # non sono in grado di leggere o scrivere una variabile che inizia con un carattere di sottolineatura, questo è un effetto, anche se causerebbe solo un problema per gli utenti che suddividono determinati oggetti.

Se un linguaggio o uno strumento non è completamente in grado di utilizzare un assembly a meno che non sia contrassegnato come conforme a CLS, ora è un grosso problema.

+0

-1. Nessuno dei casi che date come esempio ha senso. – TomTom

+0

@TomTom: sono d'accordo, quindi la mia risposta è la seguente, ma continuo a pensare che la domanda di per sé sia ​​valida. Esistono altri casi validi che impediscono la conformità CLS. Un esempio di un mio attuale progetto: il nome del progetto è REM. Lo spazio dei nomi di root di tutti i progetti nella soluzione è 'Rem'. Poiché REM è una parola chiave riservata in alcune lingue, ciò impedisce la conformità CLS. –

+0

Sì. IO sono solo un grande fan del fare un caso PROPRETAMENTE o di essere deriso. L'OP aveva tutto il tempo che il mondo si sedesse e tirasse fuori un caso sensato. – TomTom

risposta

5

Da quello che posso dire, un vero e proprio problemareale o con la non conformità è si perde la garanzia.

http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx

E 'come overclocking tuo computer o guidare l'auto con un terzo mod parte su di esso, si perde il supporto "ufficiale" da parte dei cittadini in origine la fornitura di voi se qualcosa va storto (anche se capita di lavorare) .

Nel caso di conformità CLS, si perde il supporto da MS circa l'interoperabilità del codice contro altre lingue (mia enfasi):

Se si progetta una libreria di classi CLS-compatibile, la libreria sarà avere una garanzia di interoperabilità con una vasta gamma di programmi lingue

Come per tutti i catch-22s, non ho idea. Non posso dire che mi sia mai importato della conformità al CLS.

+0

Grazie! Qualcuno che si è concentrato sulla domanda reale. Sei fantastico! –

4

Circa il problema si è utilizzato come esempio:

  • Se la proprietà pubblica ha un setter pubblico e getter, la variabile protetta non è necessario, perché le classi derivate possono impostare il valore utilizzando la proprietà pubblica.
  • Se la proprietà pubblica non ha un setter pubblico, dagli un setter protetto. Ciò elimina la necessità di una variabile protetta, poiché le classi derivate possono impostare il valore utilizzando il setter protetto della proprietà pubblica.
  • Le variabili pubbliche dovrebbero essere evitate completamente.

Conclusione: Normalmente è necessario no per variabili protette o anche pubbliche. Può essere modellato utilizzando le proprietà.

+0

@Daniel Normalmente, hai ragione. Ma a volte ci sono casi in cui una sottoclasse dovrebbe avere la capacità di aggirare la convalida che avviene nel pubblico setter. Un altro caso è quando l'invalidazione avviene nel pubblico setter, tuttavia la sottoclasse deve essere in grado di controllare o evitare tale invalidazione. –

+0

Bottom line: quando una libreria avviata nel 2007 ha 50+ plug-in ed è integrata in più di 10.000 sistemi, la ridenominazione delle variabili protette solo per rendere felice il compilatore non è una grande opzione. –

+2

@ComputerLinguist: non utilizzerei ancora un campo protetto per questo. Userò i metodi correttamente denominati per questo caso, perché comunicano molto chiaramente l'intento. Nel tuo caso, qualcuno che legge il codice della tua classe derivata deve sapere che il setter pubblico della proprietà nella classe base fa qualcosa che vuoi evitare ed è per questo che stai accedendo direttamente al campo. Un metodo 'SetAgeWithoutValidation' renderebbe ovvia la tua intenzione. –

Problemi correlati