c # - Forskel mellem deklarerer og initialiserer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er meget ny til C # og til programmering generelt, og der er noget, jeg undrer mig over forskellen mellem blot at erklære noget vs. initialisering.
Hvis jeg for eksempel bruger String.Split() metode, står det i dokumentationen, at det returnerer en matrix med de afgrænsede tegn, men hvorfor kan jeg ikke få adgang til det pågældende array? Jeg skal gøre noget som:


string [] array = mystring.Split()


Er der en måde at arbejde med noget, der kun er erklæret, men ikke initialiseret? Hvad sker der under runtime med ting, der kun er erklæret (variabler, arrayer osv.)?
Tak skal du have.

Bedste reference


Du erklærer en variabel ved at angive den s type og navn:


string[] array;


Du initialiserer det ved at give det det s initialværdi:


string[] array; // declare
array = mystring.Split(); // initialize


I c #, som i mange andre programmeringssprog, kan du kombinere begge handlinger til en enkelt kode linje:


string[] array = mystring.Split();


Når du gør det med lokale variabler, overvej at bruge var i stedet for eksplicit at bruge typen af ​​variablen i erklæringen, men kun i tilfælde, hvor variabeltypen let kan udledes fra den højre side af opgaven operatør: [21]


var list = new List<int>(); // best.

var array = mystring.Split(); // still quite good.

var myVar = SomeClass.SomeMethodThatWeDoNotKnow(); // not so good...


Begrundelsen for dette er, at det er indlysende for alle, der læser koden, at list af en List<int>, mens du skal vide hvilken streng.Split vender tilbage til at vide, at array er en matrix af strenge, og du skal rent faktisk holde musen over var søgeordet for at vide, hvilken type er myVar.


Når deklarerer felter (betyder - klasseniveauvariabler), initialiseres de automatisk med deres standardværdi - null for referencetyper, 0 for tal osv. '. Denne standardværdieregel gælder dog ikke for lokale variabler (betyder - variabler erklæret inde i en metode) eller til metode argumenter - Du skal eksplicit initialisere dem, før du kan bruge dem, ellers får du en kompileringsfejl: [22]


int a;
Console.Write(a);


Vil give denne kompileringsfejl:



  Brug af ikke-tildelt lokal variabel 'a'



Når du bruger en metode, der returnerer noget (dvs. det er ikke void), kan du bruge det, som denne metode vender tilbage direkte uden at sætte resultatet i en variabel: [23]


if(myString.Split()[0] == someSubString) // use a value from the array
{ /* do some stuff here */ }

var result = SomeClass.Method().ToString(); // use ToString on the return value of Method


eller bare ignorere returværdien, hvis du ikke har brug for det:


// Just an example, don't do that with TryParse!
int i;
int.TryParse(s, out i); // if fails, i will be initialized to it's default value - 0

// do some other stuff

Andre referencer 1


hvorfor kan jeg ikke få adgang til det pågældende array?


Du kan, du behøver ikke at sætte resultatet i en variabel:


System.Diagnostics.Debug.Print(mystring.Split()[0]); //will print the value of index 0. This is dangerous.


Er der en måde at arbejde med noget, der kun er erklæret, men ikke initialiseret?


Du kan tjekke om, hvad der er angivet, er null, hvis det er et referenceobjekt, så teknisk, det arbejder med det, før det initialiseres. Værdityper initialiseres til en standard, når de er angivet. Du kan erklære nogle typer og se på de værdier, der er tildelt debuggeren:


int four; //0
double two; //0
string[] fizbo; //null
object food; //null


Hvad sker der under runtime med ting, der kun er erklæret?


Du skal læse om, hvad der sker, når du erklærer et objekt, og hvad sker der, når du erklærer en referencetype.


Se: https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types[24]