Pergunta

Quando comecei a programar OO há muitos anos, tive a impressão de que variáveis ​​(se essa for a palavra certa) eram "primitivas" (int, double, etc.) ou objetos de primeira classe (String, JPane, etc.).Isso é reforçado por uma resposta recente sobre primitivas em Java e C# (@Daniel Pryden: Os tipos primitivos são diferentes em Java e C#?).No entanto, não sei se ValueTypes C # são primitivos, objetos ou algum outro animal, como objetos de segunda classe.Vejo que SO tem apenas um uso do first-class tag, então talvez não seja mais um termo útil.

Eu não encontrei o artigo da Wikipédia útil ("Este artigo precisa da atenção de um especialista no assunto.").Eu ficaria grato por uma taxonomia e pelo uso atual de termos, principalmente relacionados a Java e C# (embora talvez outras linguagens possam esclarecer).

Esclarecimento:Eu gostaria de entender o termo primeira classe e qual é a sua gama de utilização.

Foi útil?

Solução

O problema é que “objeto de primeira classe” não é um conceito bem definido.

O uso normal é que alguém diga que um “objeto” é uma classe de coisa que deve possuem todas as propriedades X, Y e Z.Mas há outras coisas que não possuem todas essas propriedades, mas são uma espécie de objeto.Portanto, chamaremos os antigos objetos de "primeira classe" e o restante não de "primeira classe"...e podem não ser objetos.

O problema é que existem inúmeras visões sobre as propriedades que uma coisa precisa ter para torná-la um objeto de "primeira classe".E não há perspectiva de pessoas com opiniões opostas chegarem a um consenso.(Por exemplo, um especialista em linguagem Javascript pode argumentar veementemente que um objeto só é de primeira classe se for baseado em modelo.)

Os únicos insights realmente sólidos sobre "primeira classe" serão aqueles que você pode obter nas respectivas especificações de linguagem para Java e C#.E eles só se aplicam realmente no âmbito dos respectivos sistemas de linguagens/tipos...e não em vários idiomas.

Portanto, "objeto Java de primeira classe" ou "objeto C# de primeira classe" pode ser significativo, mas "objeto de primeira classe" retirado do contexto não é.

Bom, essa é a minha opinião...

Outras dicas

A noção de “cidadão de primeira classe” ou “elemento de primeira classe” em uma linguagem de programação foi introduzida pelo cientista da computação britânico Christopher Strachey na década de 1960, no contexto de funções de primeira classe.A formulação mais famosa deste princípio está provavelmente em Estrutura e Interpretação de Programas de Computador por Gerald Jay Sussman e Harry Abelson:

  • Eles podem ser nomeados por variáveis.
  • Eles podem ser passados ​​como argumentos para procedimentos.
  • Eles poderão ser devolvidos como resultado de procedimentos.
  • Eles podem ser incluídos em estruturas de dados.

Basicamente, significa que você pode fazer com este elemento da linguagem de programação tudo o que pode fazer com todos os outros elementos da linguagem de programação.

No .NET você não tem tipos primitivos versus classes.Em vez disso, você tem estruturas versus classes, mas as estruturas compartilham muitos dos recursos das classes (como a capacidade de ter propriedades e métodos) e herdam do Object aula também.

Quando você escreve int em C#, por exemplo, é apenas um atalho de linguagem para o Int32 estrutura.Você pode fazer por exemplo int i=int.Parse("34"), ou mesmo string s=1234.ToString().Para atribuir instâncias de struct a variáveis ​​do tipo Object, há o mecanismo de boxe/desembalagem.

Em Java, por outro lado, você realmente tem a dicotomia tipos primitivos versus classes.Por exemplo, para realizar operações em uma variável do tipo int, você deve usar o auxiliar Integer aula.Essa é uma das coisas que não gosto em Java em comparação com .NET.

EDITAR.Quando você lê sobre "objetos de primeira classe" (ou classes), isso significa "objetos totalmente equipados", ou seja, classes que possuem os mesmos recursos que quaisquer outras classes de sistema ou classes criadas pelo usuário.Isto é para distinguir dos "tipos primitivos limitados".

Para cada tipo de dados primitivo em Java, a biblioteca de classes principal fornece uma classe wrapper que o representa como um objeto Java.Por exemplo, a classe Int32 agrupa o tipo de dados int e a classe Double agrupa o tipo de dados double.

Por outro lado, todos os tipos de dados primitivos em C# são objetos no namespace System.Para cada tipo de dados, é fornecido um nome abreviado ou alias.Por exemplo, int é o nome abreviado de System.Int32 e double é a forma abreviada de System.Double.

A lista de tipos de dados C# e seus aliases é fornecida na tabela a seguir.Como você pode ver, os primeiros oito correspondem aos tipos primitivos disponíveis em Java.Observe, entretanto, que o booleano do Java é chamado bool em C#.

De : http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx

http://onjava.com/onjava/2003/05/21/delegates.html

em outras palavras, os métodos c# são objetos de primeira classe porque podemos passá-los em outro método.podemos usar métodos como quaisquer outros valores (strings, números, objeto criado pelo usuário).

Outro exemplo de objetos de primeira classe que você pode achar incomuns em outras linguagens, mas c# são Expressões

Francamente, não tenho ideia do que seja um "objeto de primeira classe"...
Mas encontrei pela primeira vez o uso de uma expressão semelhante na documentação e na lista de discussão de Lua, dizendo que funções são cidadãos de primeira classe, ou valores de primeira classe.

Deixei um dos autores de Lua explicar o que é: Programando em Lua:6 – Mais sobre Funções

Significa que, em Lua, uma função é uma valor com os mesmos direitos que valores convencionais como números e strings.As funções podem ser armazenadas em variáveis (globais e locais) e em tabelas, podem ser passados como argumentos, e pode ser devolvido por outros funções.

De alguma forma, esta definição se aplica a objetos em Java:você pode armazená-los em variáveis, em arrays, usá-los como parâmetros de função e retorná-los, usá-los como chave do HashMap e outras coleções, etc.
Não tenho certeza se é assim que o termo é usado para objetos, mas pelo menos faz sentido...:-)

Numa linguagem como C, os objetos têm que ser feitos do zero, usando alguns truques (recriar C++, de alguma forma...), para que não sejam de primeira classe:você tem que passar ponteiros para manipulá-los.

Quando falamos de “objetos de primeira classe” por “objetos” queremos dizer alguns conceitos da linguagem, não os objetos que criamos nessa linguagem.É por isso que também existem termos como “cidadãos de primeira classe”.

Assim, por exemplo, Java tem os seguintes conceitos - objetos Java, primitivos Java, campos, métodos e outros (por objetos Java quero dizer qualquer coisa que seja uma instância do tipo Object).Eu diria que em Java tanto os objetos Java quanto os primitivos Java são cidadãos de primeira classe na linguagem.

Em C# temos alguns conceitos adicionais que podemos “testar” para propriedades de primeira classe.Por exemplo, delegados.Podemos atribuir um delegado a uma variável (dar um nome), passá-lo para o método como argumento, retorná-lo do método, incorporá-lo em estruturas de dados (ter um Dicionário de delegados, por exemplo).Então acho que podemos dizer que os delegados são objetos de primeira classe em C#.Você pode continuar com outros conceitos de C# - eventos, propriedades...

Linguagens funcionais têm conceito de “função” e claro é um cidadão de primeira classe em qualquer linguagem funcional.Eu diria que podemos chamar a linguagem de linguagem funcional se ela tiver "função" como conceito de primeira classe (nomear, passar, retornar, incorporar...).

Então, se alguma linguagem trouxer alguns conceitos podemos “medir” o poder desses conceitos na própria linguagem.

Objetos de primeira classe são aqueles objetos que criamos sem usar a palavra-chave 'new'.Normalmente criamos objetos usando a palavra-chave 'new', mas alguns objetos em linguagem de programação criamos sem usar a palavra-chave 'new'.

Em java, 'String' é um objeto de primeira classe.É um conceito java e não é um conceito padrão para todas as linguagens de programação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top