Articles of linguaggio design

Membro ereditario “membro” C #: perché esiste?

In C #, i membri statici di una superclass vengono “ereditati” nell’ambito delle sottoclassi. Per esempio: class A { public static int M() { return 1; } } class B : A {} class C : A { public new static int M() { return 2; } } […] AM(); //returns 1 BM(); //returns 1 […]

Perché C ++ ha bisogno dell’operatore di risoluzione dell’ambito?

(So ​​cosa fa l’operatore di risoluzione scope, e come e quando usarlo.) Perché C ++ ha l’operatore :: , invece di usare il . operatore per questo scopo? Java non ha un operatore separato e funziona correttamente. C’è qualche differenza tra C ++ e Java che significa che C ++ richiede un operatore separato per […]

Perché i campi privati ​​sono privati ​​del tipo, non dell’istanza?

In C # (e in molti altri linguaggi) è perfettamente legittimo accedere a campi privati ​​di altre istanze dello stesso tipo. Per esempio: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if(anotherFoo.aBool) … } } Come specifica C # (paragrafi 3.5.1, 3.5.2) afferma che l’accesso ai campi privati ​​è su un […]

Numerazione del mese basata su zero

Alcuni linguaggi di programmazione popolari utilizzano la numerazione del mese distriggersta da 1 – Mi viene in mente JavaScript, così come Java, e se la memoria serve, C è un altro. Ho alcune domande: Se stai per ignorare la numerazione del mese usata dai laici, perché non per motivi di coerenza ignorare anche la numerazione […]

Perché i riferimenti non sono resettabili in C ++

I riferimenti C ++ hanno due proprietà: Puntano sempre allo stesso object. Non possono essere 0. I puntatori sono il contrario: Possono indicare oggetti diversi. Possono essere 0. Perché in C ++ non esiste “riferimento o puntatore non annullabili, resettabili”? Non riesco a pensare a una buona ragione per cui i riferimenti non dovrebbero essere […]

Perché le funzioni inline di C ++ nell’intestazione?

NB Questa non è una domanda su come utilizzare le funzioni inline o come funzionano, più perché sono fatte come sono. La dichiarazione di una funzione membro della class non ha bisogno di definire una funzione come inline , è solo l’effettiva implementazione della funzione. Ad esempio, nel file di intestazione: struct foo{ void bar(); […]

Perché non posso avere metodi statici astratti in C #?

Ultimamente ho lavorato con i provider con successo, e mi sono imbattuto in una situazione interessante in cui volevo avere una class astratta che avesse un metodo statico astratto. Ho letto alcuni post sull’argomento, e in qualche modo aveva senso, ma c’è una bella spiegazione chiara?

Perché Rust non supporta l’upcast degli oggetti tratto?

Dato questo codice: trait Base { fn a(&self); fn b(&self); fn c(&self); fn d(&self); } trait Derived : Base { fn e(&self); fn f(&self); fn g(&self); } struct S; impl Derived for S { fn e(&self) {} fn f(&self) {} fn g(&self) {} } impl Base for S { fn a(&self) {} fn b(&self) {} […]

Perché Ruby non supporta i ++ o i- (operatori di incremento / decremento)?

L’operatore di pre / post incremento / decremento ( ++ e — ) è una syntax di linguaggio di programmazione piuttosto standard (per linguaggi procedurali e orientati agli oggetti, almeno). Perché Ruby non li supporta? Capisco che potresti fare la stessa cosa con += e -= , ma sembra stranamente arbitrario escludere una cosa del […]

Perché abbiamo bisogno di dichiarazioni break after case?

Perché il compilatore non inserisce automaticamente le istruzioni di interruzione dopo ogni blocco di codice nello switch? È per ragioni storiche? Quando vuoi eseguire più blocchi di codice?