Domanda

Quando ho iniziato a programmare OO molti anni fa ho avuto l'impressione che le variabili (se questa è la parola giusta) fossero "primitive" (int, double, ecc.) o oggetti di prima classe (String, JPane, ecc.).Ciò è rafforzato da una recente risposta sulle primitive in Java e C# (@Daniel Pryden: I tipi primitivi sono diversi in Java e C#?).Tuttavia non so se i ValueType C# siano primitive, oggetti o qualche altra bestia come oggetti di seconda classe.Vedo che SO ha un solo utilizzo di first-class tag quindi forse non è più un termine utile.

non ho trovato l'articolo di Wikipedia utile ("Questo articolo necessita dell'attenzione di un esperto in materia.").Sarei grato per una tassonomia e l'uso attuale dei termini, principalmente legati a Java e C# (anche se forse altri linguaggi forniranno chiarimenti).

Una precisazione:Vorrei capire il termine prima classe e qual è il suo campo di utilizzo.

È stato utile?

Soluzione

Il problema è che "oggetto di prima classe" non è un concetto ben definito.

L'uso normale è che qualcuno dice che un "oggetto" è una classe di cosa che dovrebbe avere tutte le proprietà X, Y e Z. Ma ci sono altre cose che non hanno tutte queste proprietà, ma sono specie di oggetto-ish. Così chiameremo gli ex oggetti "prima classe" e il resto non "prima classe" ... e potrebbero non essere oggetti.

Il problema è che ci sono un certo numero di punti di vista sulle proprietà che una cosa deve avere per renderlo un oggetto "di prima classe". E nessuna prospettiva di persone con punti di vista opposti venire a un consenso. (Ad esempio, un esperto di linguaggio Javascript potrebbe sostenere strenuamente che un oggetto è solo di prima classe se è basato sul modello.)

Gli unici spunti davvero solido su "first-classness" saranno quelli che si possono ricavare dalle rispettive specifiche del linguaggio per Java e C #. E hanno veramente solo si applicano nell'ambito dei rispettivi sistemi di lingue / di tipo ... e non in più lingue.

Quindi, "oggetto di prima classe Java" o "# oggetto di prima classe C" potrebbe essere significativo, ma "oggetto di prima classe" fuori contesto non è.

Bene, questo è il mio parere ...

Altri suggerimenti

La nozione di "di prima classe cittadino" o "di prima classe elemento" in un linguaggio di programmazione è stato introdotto dallo scienziato di computer britannico Christopher Strachey nel 1960 nel contesto della prima classe funzioni. La più famosa formulazione di questo principio è probabilmente nel Struttura e Interpretazione dei programmi informatici da Gerald Jay Sussman e Harry Abelson:

  • Si può essere chiamato da variabili.
  • Possono essere passati come argomenti alle procedure.
  • Possono essere restituiti i risultati delle procedure.
  • Possono essere inclusi in strutture di dati.

In sostanza, significa che si può fare con questo linguaggio di programmazione elemento tutto ciò che si può fare con tutti gli altri elementi del linguaggio di programmazione.

In .NET non si dispone di tipi primitivi vs classi. Invece, avete le strutture vs classi, ma le strutture di condividere molte delle caratteristiche delle classi (come ad esempio la capacità di avere proprietà e metodi), e ereditare dalla classe Object pure.

Quando si scrive int in C #, per esempio, è solo una scorciatoia lingua per la struct Int32. Si può fare, ad esempio int i=int.Parse("34"), o anche string s=1234.ToString(). Per assegnare le istanze struct a variabili di tipo Object, c'è boxe / unboxing meccanismo .

In Java, d'altra parte, si ha davvero i tipi primitivi vs classi dicotomia. Così, per esempio per eseguire operazioni su una variabile di tipo int, è necessario utilizzare la classe Integer ausiliaria. Questa è una delle cose che non mi piace di Java rispetto a .NET.

Modifica . Quando si legge di "oggetti di prima classe" (o classi), significa "oggetti completamente alimentati", vale a dire, le classi che hanno le stesse capacità di qualsiasi altra classe o le categorie di utenti-made. Questo è quello di distinguere da "tipi primitivi limitati".

Per ogni tipo di dati primitivo in Java, la libreria di classi principale fornisce una classe wrapper che lo rappresenta come un oggetto Java.Ad esempio, la classe Int32 racchiude il tipo di dati int e la classe Double racchiude il tipo di dati double.

D'altro canto, tutti i tipi di dati primitivi in ​​C# sono oggetti nello spazio dei nomi System.Per ciascun tipo di dati viene fornito un nome breve o alias.Ad esempio, int è il nome abbreviato di System.Int32 e double è la forma abbreviata di System.Double.

L'elenco dei tipi di dati C# e dei relativi alias è fornito nella tabella seguente.Come puoi vedere, i primi otto corrispondono ai tipi primitivi disponibili in Java.Si noti, tuttavia, che il valore booleano di Java è chiamato bool in C#.

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

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

in altre parole C # metodi sono oggetto di prima classe, perché siamo in grado di passare in un altro metodo. possiamo usare metodi come qualsiasi altro valore (stringhe, numeri, oggetti creati dagli utenti).

Un altro esempio di oggetti di prima classe che u può trovare raro in altre lingue, ma c # è Espressioni

Francamente, non ho idea di cosa sia un "oggetto di prima classe" è ...
Ma ho scoperto l'uso di un linguaggio simile nella documentazione Lua e mailing list, dicendo che le funzioni sono cittadini di prima classe, o valori di prima classe.

Ho lasciato uno degli Lua autori per spiegare quello che è: Programmazione in Lua: 6 - di più su Funzioni

  

Ciò significa che, in Lua, una funzione è un   valore con gli stessi diritti   valori convenzionali come numeri e   stringhe. Le funzioni possono essere memorizzati in   variabili (globali e locali) e   in tabelle, possono essere passate come argomenti,   e può essere restituito da altri   funzioni.

In qualche modo, questa definizione si applica agli oggetti in Java: è possibile memorizzare nelle variabili, in array, usarli come parametri di funzione e restituirli, usarli come chiave di HashMap e altre collezioni, ecc
Non so se è così che il termine è usato per gli oggetti, ma almeno ha un senso ...: -)

In un linguaggio come C, gli oggetti devono essere fatte da zero, utilizzando alcuni trucchi (ri-creazione di C ++, in qualche modo ...), quindi non sono di prima classe: devi passare puntatori giro di manipolarli.

Quando si parla di "oggetti di prima classe" da "oggetti" intendiamo alcuni concetti del linguaggio, non gli oggetti che creiamo in quella lingua. Ecco perché c'è anche tali termini come "cittadini di prima classe".

Quindi, per esempio, Java ha le seguenti concetti - Java-oggetti, Java-primitive, campi, metodi e altro (da Java-oggetti voglio dire tutto ciò che è un'istanza di tipo Object). Direi che in Java sia Java-oggetti e Java-primitive sono cittadini di prima classe nel linguaggio.

In C # abbiamo alcuni concetti aggiuntivi che possiamo "test" per le proprietà di prima classe. Ad esempio, i delegati. Possiamo assegnare delegato variabile ot (dare un nome), passarlo al metodo come argomento, ritorno dal metodo, includere nella strutture di dati (un dizionario di delegati per esempio). Quindi penso che possiamo dire che i delegati sono oggetti di prima classe in C #. Si può proseguire per altri concetti di C # - eventi, proprietà ...

I linguaggi funzionali hanno concetto di "funzione" e, naturalmente, è un cittadino di prima classe in qualsiasi linguaggio funzionale. Direi che possiamo chiamare il linguaggio un linguaggio funzionale se ha "funzione" come concetto di prima classe (nome, pass, ritorno, incorporare ...).

Quindi, se qualche lingua portare alcuni concetti che possiamo "misurare" la potenza di questi concetti nella lingua è di per sé.

oggetti di prima classe sono quegli oggetti che creiamo senza l'utilizzo di 'nuovo' parola chiave. Normalmente creiamo un oggetti usando la parola chiave 'nuovo', ma un oggetto in un linguaggio di programmazione che creiamo senza l'utilizzo di 'nuovo' parola chiave.

In java 'String' è un oggetto di prima classe. Si tratta di un concetto di Java e non è un concetto stander per tutti i linguaggi di programmazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top