Olen nähnyt monta kertaa lausuntoja, kuten ”” Tee tästä ominaisuudesta ensimmäisen luokan kansalainen niin ja niin kielellä / alustalla ”. Esimerkiksi sanotaan laskelmista C # /. Netissä. Milloin ominaisuutta pidetään ”ensimmäisen luokan kansalaisena” ohjelmointikielellä / -alustalla?

Kommentit

vastaus

Määritelmä

Objekti on ensiluokkainen, kun se:

  • voidaan tallentaa muuttujiin ja tietorakenteisiin
  • voidaan välittää parametrina aliohjelmaan
  • palauttaa aliohjelman tuloksena
  • voidaan rakentaa ajon aikana
  • sillä on oma identiteetti (riippumatta mistä tahansa nimestä)

Termiä ”esine” käytetään tässä löyhästi, ei välttämättä viittaa olioihin olio-ohjelmoinnissa. Yksinkertaisimmat skalaariset tietotyypit, kuten kokonaisluku ja liukuluvut, ovat melkein aina ensiluokkaisia.

http://en.wikipedia.org/wiki/First_class_object

Kommentit

  • Joten mikä tekee luettelosta toisen luokan objektin .net / C #: ssä?
  • @Gulshan – voit väittää sisäisen identiteetin puuttumisen – C # enumit ovat pohjimmiltaan vain syntaktista sokeria (ts. ” etunimi ”) kokonaislukuarvolle. Vertaa Java-sovellukseen, jossa enumit ovat omia esineitä.
  • @mikera, .NET-enumit ovat itsenäisiä arvoja. Java: lla ei vain ole arvoja, vaan vain objekteja, jotka ’ ovat ainoa ero.
  • @mikera: Vaikka tämä estää Java ’ luulee, että sillä on joitain hienoja ominaisuuksia, kuten mahdollisuus kuvata bittikenttiä niiden kanssa. Vaikka niiden toteutus on luultavasti ensiluokkaisempi, useimmilla niiden sovellusliittymillä on silti runsaasti kokonaislukuvakioita (tai merkkijonoja), ja niiden monia käyttötapoja ei voida helposti korvata enumeilla. ”e45fbb3b6b”>

eikö luulisi, että enumeja voidaan rakentaa ajon aikana .Netissä, eikö vain? Luulin, että ne olivat aina vakioita.

Vastaus

Käsite ” ensimmäisen luokan kansalainen ” tai ” ensiluokkainen elementti ” otti käyttöön ohjelmointikielen brittiläinen tietojenkäsittelytieteen tutkija Christopher Strachey 1960-luvulla ensimmäisen -luokan toiminnot. Tämän periaatteen tunnetuin muotoilu on todennäköisesti Gerald Jay Sussmanin ja Harry Abelsonin julkaisussa Tietokoneohjelmien rakenne ja tulkinta :

  • Ne voidaan nimetä muuttujilla.
  • Ne voidaan välittää argumentteina menettelyille.
  • Ne voidaan palauttaa tuloksena menettelyt.
  • Ne voivat sisältyä tietorakenteisiin.

Periaatteessa se tarkoittaa, että voit tehdä tämän ohjelmointikielielementti kaiken, mitä voit tehdä kaikkien muiden ohjelmointikielen elementtien kanssa.

Kaikki koskee ” yhtäläisiä oikeuksia ”: voit tehdä kaikki edellä mainitut, esimerkiksi kokonaislukuilla, joten miksi minkä tahansa muun asian pitäisi olla erilainen?

Yllä oleva määritelmä on hieman rajoittava siinä mielessä, että se vain todella puhuu ensiluokkaisuuden näkökulmasta, joka liittyy ohjelman kohteisiin. Yleisempi määritelmä wou On, että jokin asia on ensiluokkainen, jos pystyt tekemään kaiken sen kanssa, voit tehdä myös muilla vastaavilla tavoilla.

Esimerkiksi Java-operaattorit ja Java-menetelmät ovat samanlaisia. Voit määritellä uusia menetelmiä, voit (jonkin verran) vapaasti valita omien menetelmien nimet, voit ohittaa menetelmät, voit ylikuormittaa menetelmiä. James Gosling voi tehdä kaiken tämän myös operaattoreiden kanssa, mutta sinä ja minä emme voi t. Tarkoitan, toisin kuin yleisesti uskotaan, Java tukee operaattorin ylikuormitusta: esimerkiksi , + -operaattori on ylikuormitettu ryhmälle byte, short, int, long, float, double ja String ja Java 7: n IIRC myös BigInteger ja BigDecimal (ja todennäköisesti pari, jonka unohdin), se ei ole vain sitä, että sinulla ei ole mitään vaikutusta siihen.Tämä tekee operaattoreista selvästi toisen luokan tämän toisen määritelmän mukaan. Huomaa, että menetelmät eivät silti ole ensimmäisen luokan objekteja ensimmäisen määritelmän mukaan. (Tekeekö tämä operaattoreista kolmannen luokan?)

Kommentit

  • Hyvä vastaus. Joten esimerkiksi pipenv-asiakirjoissa sanotaan ” Windows on ensiluokkainen kansalainen, ” Tarkoittaako tämä, että voit tehdä kaiken Windows-käyttöjärjestelmässä pipenv, mitä voit tehdä sen myös Linuxilla?
  • Ei, en ’ usko, että termin ” ensimmäisen luokan kansalainen ” on mitään tekemistä muodollisen ohjelmointikieliteorian määritelmän kanssa. Luulen, että pipenv vain käyttää termiä normaalilla englanninkielisellä merkityksellään.
  • Kuten kohdassa ” kohdeltiin oikeudenmukaisesti? ” Kiitos avustasi.

Vastaa

Yleensä tämä refe rs rakenteeseen, joka on parametrina kulkeva, voidaan määritellä palautustyypiksi funktiosta tai sille voidaan antaa arvo. Normaalisti sinun on pystyttävä rakentamaan ne ajon aikana. Esimerkiksi luokan esimerkki olisi ensimmäisen luokan kansalainen c ++: ssa tai jaavassa, mutta funktio C: ssä ei olisi.

kommentit

  • Mikä tekee luokasta ensimmäisen luokan kansalaisen c ++: ssa?
  • @bjarkef: Kuulostaa siltä, että jo vastattiin vastaamalla edellisissä lauseissa tarjottua kuvausta.
  • @Jonathan: Kyllä, anteeksi, olen lukenut ” -rakenteen väärin ajon aikana ”. Kyllä, voit luoda luokan ilmentymän ajon aikana (objektin), mutta et itse luokkaa. Se hämmensi minua.
  • Parametrilla välittäminen ei silti riitä. Kohdassa C / C ++ harkitsisin edelleen toimintoja toisen luokan kansalaisina. Ne voidaan välittää parametreina, palauttaa tuloksina muiden esineiden sisään. Mutta niitä ei voida manipuloida ilman muiden rakenteiden apua (kuten std :: bind vaaditaan parametrien sitomiseksi funktioon).
  • @Martin En ole koskaan sanonut, että funktiot olisivat ensimmäisen luokan kansalaisia C / C ++: ssa .

vastaus

Sanoisin, että ominaisuus on ensiluokkainen kansalainen, jos sen toteuttaa vain kieli .
eli se ei vaadi useita kieliominaisuuksia tai vakiokirjastoa kyseisen ominaisuuden käyttöönottamiseksi.

Esimerkki:

C / C ++: ssa en pidä funktioita ensimmäisinä luokan kansalainen (muut voivat).
Tämä johtuu siitä, että on tapoja manipuloida toimintoja, joita kieli tukee suoraan, mutta jotka edellyttävät muiden kieliominaisuuksien käyttöä. Parametrien sitomista funktioon ei tueta suoraan, ja tämän ominaisuuden toteuttamiseksi sinun on rakennettava funktori.

Kommentit

  • Wouldn ’ t, jotka tekevät sidotut toiminnot (tai ” sulkemiset ”), eivät ole ensiluokkaisia, kun taas toiminnot itse ovat? Kuinka 0x ’ -tuki sulkemisille vaikuttaa analyysiisi?
  • @Fred Nurk: Kaikki riippuu kielestä. Joillakin kielillä sulkeminen on ensiluokkaista järjestelmää. Toisissa ei. En ole vielä tarpeeksi perehtynyt C ++ 0x: ään, jotta voin tehdä nimenomaisen kommentin.
  • Olkoon ’ s sanottu, että kieli on joko C tai C ++ (mutta ei 0x ), kuten vastaat. Eikö ’ määritä ” ensimmäisen luokan ” määritettyjä funktioita (tai ” sulkemiset ”) eivät ole ensiluokkaisia, kun taas toiminnot itse ovat?
  • @Fred Nurk: Jos rajoitat Ainoa asia, jonka voit tehdä toiminnolla, on tehdä niistä sulkeminen ja sitten varma. Mutta minulle ’ haluavat sanoa, jos alusta tukee kokonaislukujen lisäämistä vain tuomalla kirjaston. Sitten kokonaisluvut ovat ensimmäisen luokan kansalaisia, mutta kokonaislukujen lisäämistä ei harkita. Mielestäni sulkeminen on toiminto, joka voidaan suorittaa toiminnolle, joka palauttaa tehokkaasti uuden funktion (mutta se riippuu siitä, kuinka määrität sen). Mutta sulkeminen ja sitominen ovat vain kaksi toimenpidettä, kuinka monta muuta jätämme pois keskustelusta (en ole varma, että se oli kysymys).
  • @Martin: En saa selittää itseäni selvästi. Koska ” ominaisuus on ensiluokkainen kansalainen, jos sen toteuttaa vain kieli ”, toiminnot sekä C: ssä että C ++: ssa toteutetaan yksinomaan kielen mukaan ja olisi siten ensiluokkainen. Sidotut toiminnot (joita voidaan kutsua myös ” sulkemiksi ”) ovat mitä ’ uudelleen puhuminen sitovilla parametreilla jne., mutta se ’ on eri ominaisuus.

Vastaa

Esimerkin lisääminen jo annettuihin vastauksiin:

WCF: ssä / C # sinun on tällä hetkellä merkittävä luokkaobjekti palvelusopimusmääritteellä, jotta se toimii palveluna. Ei ole olemassa sellaista asiaa kuin:

public **service** MyService (in relation public **class** MyClass). 

Luokka on ensimmäisen luokan kansalainen luokassa c #, missä palvelua ei ole.

Toivottavasti tämä auttaa

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *