C #: matrizes baseadas em Nonzero não são compatível com CLS
-
11-09-2019 - |
Pergunta
Atualmente, estou lendo Albahari 's C # 3.0 em um Nutshell e na pág. 241, enquanto falando de indexação Array, ele diz o seguinte:
matrizes baseadas em Nonzero não são CLS (Common Language Specification)-compatível
O que significa exatamente, para matrizes diferentes de zero a não ser compatível com CLS ? E que implicações isso tem sobre o seu código?
[Update]
Aqui é um link para a página do livro.
Solução
Os CLS (Common Language Specification) estabelece as bases para um conjunto comum de regras para o cumprimento que garante que outras línguas (VB.NET, F #, etc.) pode usar conjuntos que você construiu com C #. Uma matriz baseada em zero não seria compatível como outros idiomas esperar matrizes para ser baseada em zero.
Aqui está um exemplo de que é mais fácil de entender:
class Foo
{
public void Bar() { }
public void bar() { }
}
Este tipo seria não ser compatível com CLS, uma vez que contém dois membros que diferem apenas no nome, por tipo. Como é que alguém usando VB.NET disambiguate entre Bar
e bar
desde o compilador VB.NET não é case-sensitive?
Então, basicamente, o CLS é um monte de regras como essa para garantir a interoperabilidade entre os idiomas.
Outras dicas
CLS é principalmente sobre certificando-se de que seu código é tão amplamente compatível com outras línguas quanto possível. Ele inclui coisas como não expor membros públicos que diferem apenas por caso (que iria confundir VB, que é case-insensitive). Veja este MSDN artigo para mais informações, juntamente com o especificação de linguagem comum si.
I além do que tem sido dito, existem matrizes à base diferentes de zero apenas para facilitar a transição para o código VB6 (principalmente pela ferramenta de migração automática) existente uma vez que em VB6, a indexação de matriz poderia começar a partir de um número arbitrário, não necessariamente zero.
Devido ao problema de compatibilidade CLS (e outras considerações), não é recomendado para nunca usá-los em .NET (mesmo quando a programação VB.NET). Além disso, a sua utilização é bastante restrita. É mais fácil apenas para fazer uma tradução compensado por encapsular a matriz dentro de uma classe e escrever um operador de acesso de índice apropriado.
Além disso,
Se a sua aplicação não se destina a trabalhar com outros programas -. Como em é uma unidade auto-suficiente que você não vai vender como uma biblioteca de classe pública para outras pessoas, não se preocupe muito sobre isso
Mas os outros comentários aqui são corretas ao desenvolver uma biblioteca de classe genérica.
É sempre uma boa prática para uso. [Assembly: CLSCompliant (true)], mas não é fundamental para obter o aplicativo em execução