Care este diferența între const și readonly in C#?



Ce diferență este între **`const`** și **`readonly`** in C#? 


Când ai folosi-o pe cealaltă?
În afară de diferența aparentă de 


* având de a declara valoarea in timp de o definiție pentru un `const` VS `readonly` valori pot fi calculate dinamic, dar trebuie să fie atribuite înainte de constructorul ieșirile.. după care este înghețat.
* 'const's sunt implicit "statice". Utilizați o `ClassName.ConstantName` notație pentru a le accesa.


Există o diferență subtilă. Ia în considerare o clasă definită în `AssemblyA`.



```
public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}
```

`AssemblyB "referințe" AssemblyA și folosește aceste valori în cod. Atunci când acest lucru este compilat, 


* în caz de `const` valoare, este ca o găsi-o înlocuiască, valoarea 2 este 'coapte în' la `AssemblyB`'s II. Acest lucru înseamnă că, dacă mâine am'll update `I_CONST_VALUE` 20 în viitor. *`AssemblyB` ar avea încă 2 până am recompilați ea*.
* în caz de `readonly` valoare, este ca un `ref` la o locație de memorie. Valoarea nu este coaptă în `AssemblyB`'s II. Acest lucru înseamnă că, dacă o locație de memorie este actualizat, `AssemblyB` devine noua valoare fără recompilarea. Deci, daca `I_RO_VALUE` este actualizat la 30, ai nevoie doar de a construi AssemblyA`. Toți clienții nu trebuie să fie recompilat.


Deci, dacă sunteți siguri că valoarea constantă a câștigat't schimba folosi un `const`. 



```
public const int CM_IN_A_METER = 100;
```

Dar, dacă aveți o constantă care se poate schimba (de exemplu, w.r.t. precizie).. sau atunci când în dubiu, utilizați o `readonly`. 



```
public readonly float PI = 3.14;
```

*Update: Aku are nevoie pentru a obține o mențiune pentru el a subliniat acest lucru în primul rând. De asemenea, am nevoie să conectați unde am învățat asta.. [Eficiente C# - Bill Wagner](https://www.amazon.com/Effective-Specific-Improve-Software-Development/dp/0321245660)*
Mă aștept răspunsul real este pur și simplu: nu a fost un bun exemplu de utilizare. Pentru cazuri, avantajul este acela că permite o fluente API asupra tipurilor existente (care nu se furnizează logica) - și anume



```
var foo = data.Where(x=>x.IsActive).OrderBy(x=>x.Price).First();

```

care permite LINQ:



```
var foo = (from x in data
           where x.IsActive
           order by x.Price
           select x).First();

```

Cu metode statice, acest lucru pur și simplu nu este o problemă, astfel încât nu există nici o justificare; doar utiliza metoda statică pe al doilea tip.


Așa cum este, metodele de extensie nu sunt *corect* obiect orientate - ele sunt un abuz pragmatic pentru a face viața mai ușoară în detrimentul purității. Nu a fost nici un motiv pentru a dilua metode statice în același mod. > 
> Se pare că prima dintre valori este interpretată ca o coloană,
> cum este asta?
> 
> 
> 


Deoarece ați primit-o la fel ca `SomeString` , în loc
de text *valoare* , cum ar fi `'SomeString'` .
Acesta este modul în care funcționează SQL - și cum funcționează și
codul normal, într-adevăr. Daca ai fi avut:



```
String foo = bar;

```

v-ați aștepta să încercați să copiați valoarea unei variabile
numite `bar` , nu-i așa? Dacă ați însemnat un șir de
trei caractere, b, a, r, ați folosi:



```
String foo = "bar";

```

Este același lucru în SQL.


Cu toate acestea, presupunând că acest SQL este construit din
valori reale, ar trebui să utilizați oricum un parametru
`PreparedStatement` cu parametri:



```
String sql = "INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount)"
             + " VALUES (?, ?, ?, ?, ?)";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, "SomeString");
pst.setInt(2, 6);
// etc

```

În acest fel, veți evita atacurile de injecție SQL și problemele
de conversie a șirului (de exemplu, pentru date). De asemenea, vă
păstrează curățarea SQL, separând codul de date. sunt ambele la fel. chroma este doar mai colorat. alege ce iti place mai mult :p bai fratilor! c++ nu trebuie sa stii neaparat html si java
c++ este un soft cu acre poti face programe. de exemplu power point e facut cu c++ cu tot cu interfata.
ce sa inveti. si eu sunt pasionat de programare, dorinta e mare.
cu ce te ajuta programarea? ai sanse mai amri sa te angajezi undeva in softwere. depozite de calculatoare sau magazine. sau la un institut de programari. faci programe.
cartea de c++ are in jur de 6-700 de pagini si e complexa. ceea ce ti.ar lua vreo 2 ani sa il cunosti si tot nu ai descoperi complet.

eu iti recomand visual basic. este fratele mai mic a lui c++
mai pe romaneste c++ este un cod
ia visual basic de pe net, varianta 2008 mai precis. e mai bun/
apoi fugi la biblioteca si ia cartea de visual basic 2008.
acolo gasesti instructiuni cum sa faci un program si cum sa programezi.
e mai usor de 10 ori ca c++ si il inveti repede. apoi cand ai invatat asta poti invata si c++ mai repede. o sa ai cunostiintele necesare de programare.
cand te apuci de visual basic trebuie sa stii ce vrei sa faca acel program pe care tu vrei sa il construesti.
tu nu trebuie decat sa respecti cartea.
asta e recomandarea mea. 
bafta. depinde de joc. la competitive, precum csgo, cod, pubg, trebuie dezactivat. În competitive nu trebuie să ai niciun fel de sincronizare între ecran și placa video. cu cât ai mai multe fps-uri și nu sunt sincronizate direct de către ecran, cu atât ai un target mai precis. acest lucru este valabil doar la competitive, pentru celelalte jocuri însă, poți activa gsync pentru a reduce lagul dintre cadre la frecvența monitorului.

teoretic, regula aceasta, după cum am mai spus și mă repet, se aplică doar la o anumită categorie de jocuri, ți-am enumerat mai devreme cele două categorii (competitive - gsync off) și (necompetitive - gsync on). simplu : gun-play! gun-play este mai realisitc, mai satisfacator, feedback'ul este mai bun, recoil prezent. pubg este mai 'slow-paced' - lent decat h1z1, mai multe items.
probabil pubg este preferat pentru ca skill'ul se vede mai bine, jocul este mai tactic gen dayz, arma, pe cand h1z1 e mai fast-paced mai rapid, gen cs, cod ( si ne-am cam plictisit de astea ). salut,

nu vreau sa te descurajez, ci doar sa iti prezint lucrurile intr-un mod poate mai diferit, avand tangente cu domeniul.

intai de toate... ceea ce consideri tu ca stii foarte bine, si anume html, de 4 luni, este o amagire. html este doar un mod de a prezenta informatia pe browser. si nimic mai mult. faptul ca stii sa scrii div si input nu inseamna ca stii html. nu te mai intreb ce fel de html stii... 4... 5? ca se complica lucrurile. baniesc (sau sper ca ai auzit macar de css... nici de ala nu te intreb care varianta o stii... 1...2...3... ca sunt mai multe tipuri. iar oricat html ai stii... din pacate nu poti sa faci nimic fara javascript. iar de cativa ani buni fara jquery si poate knockout sau angular sau backbone sau un alt mic framework de javascript. iar asta din pacate e doar pe client. ca pe server, mai este si acolo o luuunga discutie.

asta ar fi pe foarte pe scurt din punct de vedere tehnic... ceea ce stii tu.

acum, ca idee: nimeni in ziua de azi nu mai scrie un joc de la cap la coada. din simplul motiv ca jocurile au ajuns la un nivel atat de complex incat e practic imposibil ca o singura persoana sa scrie un joc: trebuie sa stii sa programezi, trebuie sa stii sa desenezi, trebuie sa fii regizor pentru a face povestea din spate, trebuie sa fii tester pentru a testa jocul, trebuie sa fii arhitect pentru a intelege arhitectura... si la final mai trebuie sa il si vinzi... pur si simplu nu poti sa faci asa ceva.

pentru ca te adresezi unei nevoi si cam atat. este adevarat ca au existat si cateva exceptii: tetris.

acum. la jocuri ma refeream pentru calculator.

insa odata cu mobilele se redeschide ideea in care ai putea sa scrii un joc pe android/iphone/windows phone/tienzen etc. aici este locul in care ai mai putea scrie un joc de unul singur. e adevarat... chiar trebuie sa te chinui... dar inca se poate.

problema mare insa pe device-uri mobile este insa ca e cam haiducie... pur si simplu fiecare si-a dezvoltat sau incearca sa isi dezvolte un sistem propriu de operare pentru a concura cu androidul (cyanogen si altele) care sunt folosite de companiile chinezesti si produc deviceuri destul de puternice la preturi mici... ceea ce ii scoate pe cei mari din joc, precum samsung, lg, etc).

astfel, apple care are un ecosistem propriu al lui a inceput sa fie copiat de microsoft cu seria lumia si inca cateva de la lg, si inca vreo doi, acum se baga tare si samsung sa isi creeze propriul ecosistem (a achizitionat un sistem numit tienzen). apare si mozilla cu un sistem numit firefox os pentru mobile, toti incearca sa fuga de android, dupa cum iti ziceam pentru ca acesta este dat si la companiile chineze. in plus androidul e gratis in reclama, dar in realitate nu e chiar gratis. sunt ceva costuri si cu licentele pe fiecare mobil, dar pentru tine ca utilizator final sunt costuri ascunse in pretul final al telefonului).

sfatul meu este ca daca tot vrei sa inveti, decide-te intai ce vrei sa faci. eu te-as sfatui sa incerci sa faci aplicatii chiar necesare. sa inveti cum se programeaza, sa treci prin ciclul vietii unei aplicatii. as lua de exemplu site-ul asta si as incerca sa il copiez, sa fac unul la fel. poti sa faci orice. dar daca tot investestk energie in asta, atunci macar fa-o sa merite, sa vina si in ban dupa.

sunt doua mari lumi in care poti sa intrii usor: lumea linux/php/java si lumea microsoft/c#. trebuie sa alegi. ambele au foarte multa documentatie de citit. 

python, c++ si c sunt cam moarte. au ramas legenda. e ca si cum inveti la scoala latina. cu adevarat niciodata nu o folosesti.

pascal... fugi. ala deja pute. nu are viitor. de nici o forma. e mort si nu il mai invie nimeni.

deci:

1. alegeti lumea. cu sau fara microsoft.

2. gaseste o aplicatie care sa faca ceva (orice) dar nu joc.

3. apuca-te si fa-o. nu au nici o legatura cu comportamentul masinii.
sunt doar niste teme. nimic mai mult.
pe eco iti arata daca conduci eco, sau schimbi viteza prea tarziu, ceea ce duce la un consum mai mare.
si celelalte sunt de design, iti schimba doar locul diferitelor chestii, temperatura bla bla. 
ps, ti-ai fi dat si tu seama, daca era ca la masinile despre care vorbesti, diferenta de a conduce pe eco si diferenta pe sport :))
este doar cosmetic. Am transmis întrebarea ta mai departe și ai mai jos răspunsul oficial, al cuiva din stafful Duolingo: 



> 
> ”On average, there are 2 forward challenges (en2ro) for 1 reverse challenge (ro2en). We are working on an optimization process of our lesson generation (with an algorithm), in order to give our users the best amount of each type of exercise, depending on which course they are taking.”
> 
> 
> * Notă: a se vedea <http://www.jetbrains.net/devnet/message/5244658> pentru o altă versiune a acestui răspuns.


Citind posturile, se pare că există o anumită confuzie cu privire la întrebarea inițială. Lasă-mă să o lovitură de cuțit la ea.


Postul original este într-adevăr cere întrebarea: „Cum pot identifica și elimina referințele dintr-un proiect Visual Studio pentru alte proiecte / ansambluri care nu sunt în uz?“ Afișul vrea ansamblurile să nu mai apară ca parte a producției construi.


În acest caz, Resharper vă poate ajuta să *identificați* ei, dar trebuie să *eliminați* - le tine. 


Pentru a face acest lucru, deschide Referințe inth Solution Browser, faceți clic dreapta pe fiecare ansamblu de referință, și alege „Find Code dependent“. Vedea:


<http://www.jetbrains.com/resharper/features/navigation_search.html#Find_ReferencedDependent_Code>


Vei primi fie:


1. O listă a dependențele pe această referință într-o fereastră de browser, sau
2. Un dialog care vă spune „Codul dependent de XXXXXXX modul nu a fost găsit.“.


Dacă obține al doilea rezultat, puteți apoi să faceți clic pe mouse-dreapta Reference, selectați Eliminare și scoateți-l din proiectul dumneavoastră.


În timp ce trebuie sa la acest „manual“, adică o referință la un moment dat, se va face treaba. Dacă cineva a automatizat acest lucru într-un fel Sunt interesat de audiere cum a fost făcut.


Puteți ignora destul de mult pe cele din .Net Framework, deoarece nu, in mod normal copiate de ieșire dvs. construi (de obicei - cu toate că nu este neapărat adevărat pentru aplicațiile Silverlight).


Unele posturi par să fie răspunsul la întrebarea: „Cum pot elimina folosind clauzele (C #) dintr-un fișier de cod sursă care nu sunt necesare pentru a rezolva orice referințe în acel dosar“. 


În acest caz, Resharper ajută în câteva moduri:


1. Identifică folosind clauze neutilizate pentru timpul pe detectarea erorii zbura. Ele apar ca avertismente de inspecție de cod - codul va apărea culoarea gri (fie implicit) în fișierul și Resharper va oferi un indiciu pentru al elimina:


<http://www.jetbrains.com/resharper/features/code_analysis.html#On-the-fly_Error_Detection>
2. Vă permite să le eliminați în mod automat, ca parte a procesului de Cod Cleanup:


<http://www.jetbrains.com/resharper/features/code_formatting.html#Optimizing_Namespace_Import_Directives>


**În cele din urmă, dau seama că Resharper face analiza codul static pe soluția. Deci, dacă aveți o referință dinamică a ansamblului - spune prin reflecție sau un ansamblu care este încărcată dinamic în timpul rulării și accesate prin intermediul unei interfețe - nu se va ridica.**  Nu există nici un substitut pentru înțelegerea dvs. de baza codului și dependențele de proiect în timp ce lucra la proiectul dumneavoastră. Fac găsi Resharper caracteristici foarte utile.