C# | ||
---|---|---|
Utvikler(e) | ||
Microsoft https://docs.microsoft.com/en-us/dotnet/csharp/ , https://docs.microsoft.com/de-de/dotnet/csharp/ , https://docs.microsoft.com/ja -jp/dotnet/csharp/ , https://docs.microsoft.com/fr-fr/dotnet/csharp/ og https://docs.microsoft.com/it-it/dotnet/csharp/ | ||
Generell informasjon | ||
Vanlige utvidelser | .cs .csx .cshtml .razor | |
Paradigme | Multiparadigme : strukturert , imperativ , objektorientert , hendelsesdrevet , funksjonell , generisk , reflekterende | |
Dukket opp i | 2000 | |
Designet av | Microsoft | |
Siste stabile versjon | 10.0 (21. mars 2022 (6 måneder og 27 dager)) | |
Siste versjon i tester | 11.0 | |
type system | Statisk , dynamisk , sterk , sikker, vurdert | |
implementeringer | Microsoft .NET , Microsoft .NET Core , Mono og DotGNU | |
dialekter | Cω , Spec Sharp, Polyfonisk C# | |
påvirket av | Java , C++ , Eiffel , Modula-3 , Pascal | |
har påvirket | D , F# , Java 5 , Vala | |
Operativsystem | Multiplattform | |
"C#" (uttales cii sharp på engelsk) er et multi -paradigme programmeringsspråk utviklet og standardisert av Microsoft - selskapet som en del av .NET - plattformen , som senere ble godkjent som en standard av ECMA (ECMA-334) og ISO ( ISO /IEC23270). C# er et av programmeringsspråkene designet for Common Language Framework .
Dens grunnleggende syntaks stammer fra C / C++ og bruker .NET-plattformobjektmodellen, som ligner på Java , selv om den inkluderer forbedringer avledet fra andre språk.
Navnet C Sharp var inspirert av ♯ - tegnet , som leses som skarpt på engelsk for notasjon. Det er et ordspill, siden "C#" betyr musikalsk sett "C skarp", der symbolet # indikerer at en tone (i dette tilfellet C, representert av C ) må være en halvtone høyere. Dette er en metafor for overlegenheten til C# i forhold til forgjengeren C++ og henspiller igjen på den samme metaforen som ble utviklet for å gi C++ navnet. [ 1 ] I tillegg kan # -symbolet tenkes som foreningen av fire + -symboler , og dermed fortsette følelsen av progresjon til C-språkene.
Selv om C# er en del av .NET-plattformen, er det et API , mens C# er et eget programmeringsspråk designet for å bygge programmer på toppen av plattformen. Det er allerede en implementert kompilator som gir Mono - DotGNU- rammeverket , som genererer programmer for forskjellige plattformer som Microsoft Windows , Unix , Android , iOS , Windows Phone , Mac OS og GNU/Linux .
Under utviklingen av .NET-plattformen ble klassebiblioteker opprinnelig skrevet ved hjelp av et administrert kodesystem kalt Simple Managed C (SMC). I april 1999 dannet Anders Hejlsberg et team med et oppdrag om å utvikle et nytt objektorientert språk . Dette navnet måtte endres på grunn av merkeproblemer, og ble kalt C#. [ 2 ] Klassebiblioteket for .NET-plattformen ble deretter overført til det nye språket, som senere ble modifisert av Joseth M.
Hejlsberg ledet utviklingsprosjektet C#. Tidligere hadde han allerede deltatt i utviklingen av andre språk som Turbo Pascal , Delphi og J++ .
C# inneholder tjue generelle kategorier av innebygde datatyper : verdityper og referansetyper . Begrepet verditype indikerer at disse typene direkte inneholder verdiene deres. Typer for å definere heltall :
Fyr | BCL- ekvivalent | Størrelse | Intervall | Betydning |
---|---|---|---|---|
byte | System.Byte | 8-bit (1-byte) | 0 til 255 | usignert heltall |
sbyte | System.SByte | 8-bit (1-byte) | -128 til 127 | signert heltall |
short | System.Int16 | 16-bit (2-byte) | -32.768 til 32.767 | signert kort heltall |
ushort | System.UInt16 | 16-bit (2-byte) | 0 til 65.535 | Usignert kort heltall |
int | System.Int32 | 32-biters (4-byte) | -2 147 483 648 til 2 147 483 647 | fortegn mellom heltall |
uint | System.UInt32 | 32-biters (4-byte) | 0 til 4.294.967.295 | usignert mellomheltall |
long | System.Int64 | 64-biters (8-byte) | -9,223,372,036,854,775,808 til 9,223,372,036,854,775,807 | signert langt heltall |
ulong | System.UInt64 | 64-biters (8-byte) | 0 til 18 446 744 073 709 551 615 | Usignert langt heltall |
Flytende kommatyper kan representere tall med brøkkomponenter. Det er to typer flytende kommatyper: flytende og dobbel . Dobbelttypen er den mest brukte typen fordi mange matematiske funksjoner i C#-klassebiblioteket bruker doble verdier . Den kanskje mest interessante flyttalltypen i C# er desimal , beregnet for bruk i pengeberegninger. Normal flytekomma-aritmetikk er gjenstand for en rekke avrundingsfeil når den brukes på desimalverdier. Desimaltypen eliminerer disse feilene og kan representere opptil 28 desimaler .
Fyr | BCL- ekvivalent | Størrelse | Intervall | Betydning |
---|---|---|---|---|
float | System.Single | 32-biters (4-byte) | ±1,401298E−45 til ±3,402823E+38 | kort flytepunkt |
double | System.Double | 64-biters (8-byte) | ±4,94065645841246E−324 til ±1,79769313486232E+308 |
langt flytepunkt |
decimal | System.Decimal | 128-bit (16-byte) | −7,9228162514264337593543950335 til +7,9228162514264337593543950335 |
Monetært flytende punkt |
Tegn i C # er ikke 8-bits store som i mange andre programmeringsspråk, men bruker i stedet 16-bits størrelse. Denne datatypen kalles charog bruker Unicode -kodingen . Det er ingen automatiske konverteringer fra heltallstype til char.
Fyr | BCL- ekvivalent | Størrelse | Intervall | Betydning |
---|---|---|---|---|
char | System.Char | 16-bit (2-byte) | '\u0000'en'\uFFFF' | unicode-tegn |
For logiske datatyper er det ingen automatiske konverteringer fra heltallstype til bool.
Fyr | BCL- ekvivalent | Størrelse | Intervall | Betydning |
---|---|---|---|---|
bool | System.Boolean | 8-bit (1-byte) | trueentenfalse | Sant eller usant |
Noen ganger er det lettere å bruke et tallsystem med base 16 i stedet for 10, i så fall lar C# deg spesifisere heltall i heksadesimalt format , og er definert ved å prependere 0x, for eksempel: , som 0xFFtilsvarer desimal . 255
C# har tegn kalt escape-sekvenser for å gjøre det lettere å skrive inn symboler som ikke har noen visuell representasjon på tastaturet.
C#, som C++, definerer en strengtype . Innenfor tegnstrengen kan escape-sekvenser brukes. En tegnstreng kan starte med symbolet @etterfulgt av en streng i anførselstegn ( "), i så fall har escape-sekvensene ingen effekt, og strengen kan spenne over to eller flere linjer.
heltall | |
---|---|
desimal | 245,[0..9]+ |
heksadesimal | 0xF5,0x[0..9, A..F, a..f]+ |
langt heltall | 12L |
usignert langt heltall | 654UL |
flytende punkt | |
flyte | 23.5F, 23.5f; 1.72E3F, 1.72E3f, 1.72e3F,1.72e3f |
dobbelt | 23.5, 23.5D, 23.5d, 1.72E3,1.72E3D |
desimal | 9.95M |
tegn | |
røye | 'a', 'Z','\u0231' |
Kjeder | |
String | "Hello, world"; "C:\\Windows\\",@"C:\Windows\" |
rømningssekvenser | |
Varsel (bjelle) | \a |
Rekyl | \b |
sidefeed | \f |
ny linje | \n |
Bil retur | \r |
horisontal fane | \t |
vertikal fane | \v |
Null | \0 |
enkelt sitat | \' |
dobbelt anførselstegn | \" |
omvendt stang | \\ |
Variabler er identifikatorer knyttet til verdier. De er deklarert som indikerer typen data som skal lagres og identifikatoren.
En identifikator kan:
En identifikator kan ikke:
Erklær en variabel:
int myNumber ; // Vi erklærer variabelen, men vi initialiserer den ikke med noen verdi.For å tilordne en verdi til en variabel, er identifikatoren indikert, etterfulgt av likhetssymbolet ( =) og verdien vi vil at den skal lagre:
mittTall = 5 ; // Vi tildeler verdien '5' til den opprettede variabelen.Du kan deklarere og tilordne en verdi samtidig:
int mittTall = 5 ; // Vi erklærer variabelen og tildeler verdien '5'.Du kan også deklarere en variabel uten å spesifisere datatypen, ved å bruke nøkkelordslutningsmekanismen der kompilatoren bestemmer datatypen som skal tilordnes til variabelen og er kun tillatt for lokale variabler, ikke for parametere eller datamedlemmer. .var
var string = "Dette er en streng" ; var nummer1 = 5 ; var nummer2 = 4,5 ; var nummer3 = 4,5D ; var objekt = nytt objekt (); var resultat = matematikk . Pow ( 5 , 2 );Variabeltypekonverteringer i C# er representert i følgende tabell der raden er kilden og kolonnen er destinasjonen.
Legende | |
---|---|
rød | Inkompatibel konvertering (I). |
Grønn | Automatisk eller implisitt konvertering (A). |
Blå | Eksplisitt konvertering (E). |
byte | sbyte | shorts | kort | int | uint | lang | lang | flyte | dobbelt | desimal | røye | bool | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
byte | OG | EN | EN | EN | EN | EN | EN | OG | OG | OG | OG | Yo | |
sbyte | OG | EN | OG | EN | OG | EN | EN | OG | OG | OG | OG | Yo | |
shorts | OG | OG | OG | EN | EN | EN | EN | OG | OG | OG | OG | Yo | |
kort | OG | OG | OG | EN | EN | EN | EN | OG | OG | OG | OG | Yo | |
int | OG | OG | OG | OG | OG | EN | EN | OG | OG | OG | OG | Yo | |
uint | OG | OG | OG | OG | OG | EN | EN | OG | OG | OG | OG | Yo | |
lang | OG | OG | OG | OG | OG | OG | OG | OG | OG | OG | OG | Yo | |
lang | OG | OG | OG | OG | OG | OG | OG | OG | OG | OG | OG | Yo | |
flyte | OG | OG | OG | OG | OG | OG | OG | OG | EN | OG | Yo | Yo | |
dobbelt | OG | OG | OG | OG | OG | OG | OG | OG | OG | OG | Yo | Yo | |
desimal | OG | OG | OG | OG | OG | OG | OG | OG | OG | OG | Yo | Yo | |
røye | OG | OG | OG | EN | EN | EN | EN | EN | EN | EN | EN | Yo | |
bool | Yo | Yo | Yo | Yo | Yo | Yo | Yo | Yo | Yo | Yo | Yo | Yo |
I tillegg til å utføres innenfor en oppgave, skjer typekonverteringer også innenfor et uttrykk, siden begge operandene i hver operasjon må være av samme type. Hvis konverteringen er av den implisitte typen, utføres følgende algoritme i den rekkefølgen:
Konstanter er uforanderlige verdier, og kan derfor ikke endres.
const
Når en konstant er deklarert med nøkkelordet const, må verdien også tildeles. Etter dette er konstanten låst og kan ikke endres. De er implisitt statiske ( static).
const dobbel PI = 3,1415 ;readonly
I motsetning til const, krever det ikke at verdien tildeles samtidig som den deklareres. De kan være medlemmer av forekomsten eller statiske medlemmer av klassen ( static).
skrivebeskyttet dobbel E ; E = 2,71828 ;Kategori | operatører |
---|---|
aritmetikk | + - * / % |
logisk | ! && || |
på bitnivå | & | ^ ~ |
Sammenkobling | + |
øke, avta | ++ -- |
Forskyvning | << >> |
Relasjonell | == != < > <= >= |
Oppdrag | =^= <<= >>= ??= |
Medlemstilgang | . |
Indeksering | [ ] |
Omdannelse | ( ) |
Betinget | ? : ?? |
objektskaping | new |
type informasjon | as is sizeof typeof |
if-else
if ( i == 2 ) { // ... } else if ( i == 3 ) { // ... } else { // ... }switch
bryter ( i ) { tilfelle 1 : ... bryte ; case 2 : case 3 : ... break ; standard : ... pause ; }for
for ( int i = 0 ; i < 10 ; ++ i ) { // ... }while
while ( i < 10 ) { // ... }do-while
gjør { // ... } mens ( sann );foreach
foreach ( char c i charList ) { // ... }ref
void PassRef ( ref int x ) { if ( x == 2 ) { x = 10 ; } } int z = 0 ; PassRef ( ref z );out
void PassOut ( ut int x ) { x = 2 ; } int z ; PassOut ( out z );params
int MaxVal ( char c , params int [] nums ) { // ... } int a = 1 ; MaxVal ( 'a' , 23 , 3 , a , - 12 ); // Den første parameteren er obligatorisk, deretter kan du sette inn så mange heltall du vilSobrecarga de métodos
int Sum ( int x , int y ) { return x + y ; } int Sum ( int x , int y , int z ) { return x + y + z ; } int Sum ( params int [] tall ) { int Sum = 0 ; foreach ( int c i tall ) Sum += c ; retur Sum ; } Sum ( 1 , 2 ); // Vil kalle den første metoden. Sum ( 1 , 2 , 3 ); // Vil kalle den andre metoden. Sum ( 1 , 2 , 3 , 4 , 5 , 6 ) // Vil kalle den tredje metoden.Main
offentlig statisk tomrom Main ( string [] args ) { // ... }Deklarer en matrise:
int [] intArray = ny int [ 5 ];Deklarer og initialiser en matrise (matrisestørrelse kan utelates):
int [] intArray = ny int [] { 1 , 2 , 3 , 4 , 5 };Få tilgang til et element:
intArray [ 2 ]; // Returnerer verdien '3'Erklær en flerdimensjonal matrise:
int [,] intMultiArray = ny int [ 3 , 2 ]; // 3 rader og 2 kolonnerDeklarer og initialiser en flerdimensjonal matrise (matrisestørrelse kan utelates):
int [,] intMultiArray = ny int [,] { { 1 , 2 }, { 3 , 4 }, { 5 , 6 } };Få tilgang til et element i en flerdimensjonal matrise:
intMultiArray [ 2 , 0 ]; // Returnerer verdien '5'Lær mer på: Array Tutorial (C# ) .
Erklær en klasse:
klasse Klasse { }Start en klasse (også kalt opprette et objekt av klassen eller instansiere en klasse ):
Klasse c = ny Klasse ();Konstruktør (som om det var en metode, men med navnet på klassen):
klasse Klasse { Klasse () { // ... } }Destruktor (som om det var en metode, innledet med symbolet ' ~'):
klasse Klasse { ~ Klasse () { // ... } }this:
klasse Klasse { int i = 1 ; Klasse () { dette . boot (); // Vil kalle objektets 'Start'-metode } void Start () { // ... } }static:
klasse Klasse { static int i = 1 ; } Klasse . jeg ; // Returnerer verdien '1'. Det er ikke nødvendig å lage et objekt, siden det er "statisk" og tilhører klassen.operator:
klasse Klasse { static int operator +( int x , int y ) { // Overstyr '+' operator // ... } static int operator -( int x , int y ) { // Overstyr '-' operator / / ... } statisk int - operator int ( byte x ) { // Overbelastningskonvertering fra type 'byte' til 'int' // ... } }Objektsammenligning:
klasse Klasse { } Klasse c1 = ny Klasse (); Klasse c2 = ny Klasse (); bool b = c1 == c2 ; // Vil returnere 'false', siden de er to forskjellige objekterDeklarer en tegnstreng (som om den var en variabel av en datatype som into double):
string text = "Tegnstreng" ; strengtekst = nytt system . _ String ( "Tegnstreng" ); // Tilsvarer ovenforLengde på en streng:
string text = "Tegnstreng" ; int i = tekst . Lengde ; // Returnerer '20'Sammenlign to strenger:
bool b = "tekst" == "tekst" ; // Returnerer 'true', siden begge strengene inneholder "tekst"Sammenknytt strenger:
string text = "String of" + " characters" ; // Merk mellomrommet før "tegn", hvis det ikke var satt, ville det vises ved siden av: "decharacters"Klassen System.String, og en forekomst av den, stringhar noen metoder for å jobbe med strenger, for eksempel:
static string Copy(string str): returnerer en kopi av str.
string text1 = "abc" ; string text2 = "xyz" ; string text2 = System . String . Kopier ( tekst1 ); // 'text2' inneholder nå "abc"int CompareTo(string str): returnerer mindre enn null hvis den kallende strengen er mindre enn str, større enn null hvis den kallende strengen er større enn str, og null hvis strengene er like.
string text = "abc" ; int i = tekst . CompareTo ( "abc" ); // Returnerer '0'int IndexOf(string str): returnerer indeksen for det første treffet til den angitte delstrengen i str, eller -1 ved feil.
string text = "abcdefabcdef" ; int i = tekst . IndexOf ( "e" ); // Returnerer '4' int j = tekst . IndexOf ( "def" ); // Returnerer '3', som er der 'd'-tegnet er funnet, etterfulgt av 'e' og 'f'int LastIndexOf(string str): returnerer indeksen for det siste samsvaret med den angitte delstrengen i str, eller -1 ved feil.
string text = "abcdefabcdef" ; int i = tekst . LastIndexOf ( "e" ); // Returnerer '10' int j = tekst . LastIndexOf ( "def" ); // Returnerer '9', som er der det siste tegnet 'd' er funnet, etterfulgt av 'e' og 'f'string ToLower: returnerer en kopi av strengen med små bokstaver.
string text = "ABC" ; strengtekst = tekst . _ ToLower (); // Vil returnere "abc"string ToUpper: returnerer en kopi av strengen med store bokstaver.
string text = "abc" ; strengtekst = tekst . _ Øvre (); // vil returnere "ABC"string Substring: returnerer en delstreng, som indikerer startposisjon og ønsket lengde.
string text = "Tegnstreng" ; strengtekst = tekst . _ delstreng ( 10 , 8 ); // Vil returnere "karakter"Mer informasjon på: String (Klasse) (System ) .
Language-Integrated Query (LINQ) er navnet på et sett med teknologier som består av direkte integrasjon av spørringsfunksjoner i C#-språket (også i Visual Basic og potensielt i et hvilket som helst annet .NET-språk). Med LINQ er en spørring nå en førsteklasses språkkonstruksjon, akkurat som klasser, metoder, hendelser og så videre.
For en programmerer som skriver spørringer, er den mest synlige språkbygde delen av LINQ spørringsuttrykket. Spørringsuttrykk er skrevet i den deklarative spørringssyntaksen som ble introdusert i C# 3.0. Ved å bruke spørringssyntaks kan du utføre selv komplekse filtrerings-, sorterings- og grupperingsoperasjoner på datakilder med minimalt med kode. De samme grunnleggende spørringsuttrykksmønstrene brukes til å spørre etter og transformere data fra SQL-databaser, ADO.NET-datasett, XML-dokumenter og -strømmer og .NET-samlinger.
Følgende eksempel viser hele spørringsoperasjonen. Den fullstendige operasjonen inkluderer å lage en datakilde, definere spørringsuttrykket og utføre spørringen i en forhver uttalelse.
klasse LINQQueryExpressions { static void Main () { // Spesifiser datakilden. int [] score = new int [] { 97 , 92 , 81 , 60 }; // Definer spørringsuttrykket. IEnumerable < int > scoreQuery = fra poengsum i poengsum der poengsum > 80 velg poengsum ; // Utfør spørringen. foreach ( int i i scoreQuery ) { Console . Skriv ( i + " " ); } } } // Utdata: 97 92 81https://msdn.microsoft.com/es-es/library/bb397676(v=vs.120).aspx
Grunnleggende " Hello world "-eksempel:
bruker System ; public class Eksempel { public static void Main ( string [] args ) { Console . WriteLine ( "Hei verden" ); } }Addisjon og sammenkobling:
bruker System ; public class Eksempel { public static void Main ( string [] args ) { int x = 10 ; int y = 20 ; Konsoll . WriteLine ( "Resultatet er: " + ( x + y )); // Vil skrive ut på skjermen: "Resultatet er: 30" } }Bruk av klasser, metoder, egenskaper og overbelastning:
bruker System ; offentlig klasse Bil { private int numDoors ; public int NumPuertas { get { return this . antallDører ; } sett { dette . numDoors = verdi ; // 'verdi' er en variabel som automatisk tildeles når du tilordner en verdi til egenskapen, // for å arbeide med den verdien. } } offentlig bil ( int numDoors ) { dette . numDoors = numDoors ; } // Overbelastning: hvis klassen instansieres uten å indikere noen parameter, initialiseres 'numDoors' med verdien '2' public Car () : denne ( 2 ) { } } public class Eksempel { public static void Main ( string [] args ) { Car car = new Car (); // Den andre bilkonstruktøren brukes . AntallPuertas = 4 ; Konsoll . WriteLine ( "Antall dører er: " + bil . NumPuertas ); // Vil skrive ut på skjermen: "Antall dører er: 4" } }Eksempel på parallelle vektorer eller matriser:
Oppgave 1:
Utvikle et program som lar deg laste inn 5 navn på personer og deres respektive aldre. Etter å ha utført tastaturinnlastingen av alle dataene, skriv ut navnene på personene som er myndige (større enn eller lik 18 år).
Program:
bruker System ; bruker System.Collections.Generic ; bruker System.Linq ; bruker System.Text ; navneområde VectorTest10 { class VectorTest10 { private string [] navn ; privat int [] aldre ; public void Load () { names = new string [ 5 ]; aldre = ny int [ 5 ]; for ( int f = 0 ; f < navn . Lengde ; f ++) { Konsoll . Skriv ( "Skriv inn navn:" ); names [ f ]= Konsoll . ReadLine (); Konsoll . Skriv ( "Skriv inn alder:" ); strenglinje ; _ linje = Konsoll . ReadLine (); aldre [ f ]= int . Parse ( linje ); } } public void OlderAge () { Console . WriteLine ( "Personer i lovlig alder." ); for ( int f = 0 ; f < navn . Lengde ; f ++) { if ( aldre [ f ] >= 18 ) { Konsoll . WriteLine ( navn [ f ]); } } Konsoll . ReadKey (); } static void Main ( string [] args ) { VectorTest10 pv = new VectorTest10 (); p.v. _ Last (); p.v. _ EldreAlder (); } } } signatur : RSRRDet bør bemerkes at de vanlige kontrollene som tilbys av .NET-plattformen kan tilpasses og/eller redigeres for å møte de ulike behovene til utviklere. Beslutningen om å lage en egendefinert kontroll kommer når du vil lage en komponent der du har full kontroll over dens funksjonelle og visuelle utseende; med mulighet for å ikke laste inn unødvendige funksjoner for utvikling.
Vanlige tilfeller der disse funksjonene ofte brukes er:
For øyeblikket er det følgende kompilatorer eller IDE -er for C#-språket:
ECMA-334-standarden viser følgende designmål for C#: