.Net előadás jegyzet – 2. óra
1.oldal
C-Sharp nyelv alapjai 1.
Egyszerű példák Az első alkalmazás a Hello World parancssorból: (cmd) notepad hw.cs A Visual Studio Command Promp-ot nyitjuk meg, mert ekkor benn van a parancssorban a C# fordító (Csc.exe C# -hoz ingyenes fordító a .NET-el együtt) using System; // képernyőre kiírás is a Systemben van! És még sok fontos dolog... namespace First //névtér { public class FirstClass { public static void Main(string[] args) //Nem kell argumentum szám, mert lekérdezhető a tömbből { Console.WriteLine("Hello World!"); //kiír } } } Fordítás: csc hw.cs Futtatás: hw.exe
Több nyelv együttműködése példa a Visual Studio 2005-el szerkesztve: Példa együttműködésre: C# és C++ Consol App. C# : +++ using System;
.Net előadás jegyzet – 2. óra
2.oldal
using System.Collections.Generic; using System.Text; //using CppClasses; namespace MainApp { class Program { static void Main(string[] args) { CppClasses.CppClass cppClass = new CppClasses.CppClass(); cppClass.CppKiir(); } } } +++
Add New project (C++): +++ // CppClasses.h #pragma once using namespace System; namespace CppClasses { public ref class CppClass { public: void CppKiir() { Console::WriteLine("Hello from cpp"); } }; } +++ Add reference a C# projektben a C++ projektre Ctrl+Shift+B = fordítás (vmi fv)
using CppClasses; és a fv-t használhatjuk a programban, vagy a teljes nevével hivatkozva használjuk a
.Net előadás jegyzet – 2. óra
3.oldal
Típusok Minden típus a System.Object-ből származik Alaptípusok: .NET Type
C# Type
Visual Basic Type
Description
System.Byte
byte
Byte
An unsigned one-byte value, 0 through 255.
System.SByte sbyte
A signed one-byte value, -128 through 127.
System.Int16 short Short
A signed two-byte value, -32768 through 32767.
System.UInt16 ushort
An unsigned two-byte value, 0 through 65535.
System.Int32 int
A signed 4-byte value, -2,147,483,648 through 2,147,483,647.
Integer
An unsigned 4-byte value, 0 through 4,294,967,295.
System.UInt32 uint System.Int64 long
A signed 64-bit integer value -9,223,372,036,854,775,808 through 9,223,372,036,854,775,807.
Long
An unsigned 64-bit integer, value 0 through 18,446,744,073,709,551,615.
System.UInt64 ulong
System.Single float Single
A 32-bit floating-point number that can hold values -3.402823e38 to 3.402823e38. Precision is 7 digits.
System.Double double Double
An 8-byte floating-point number with a range of -1.79769313486232e308 to 1.79769313486232e308, and 15 or 16 digits of precision.
system.Decimal
Fixpoint , 128-bit (16-byte) from -79,228,162,514,264,337,593,543,950,335 to negative 79,228,162,514,264,337,593,543,950,335,
Diszkrét és valós számtípusok Az int-nek megfelel a System.Int32, (32bit-en tárolja) és hasonlóan Int8 Int16 32, UInt... short, long, float, double, char, string, bool hasonló elnevezés C++-hoz ( eredeti C ++ : int illetve longnál a tárolási hossz nincs definiálva csak a < reláció, itt viszont: ) .NET szabványa szerint minden változónál a fix hosszúság adott ! Karakter és string A karakter az érték típusú (unsigned 16-bit) String = karakter tömb (16 bites Unicode ld. később) viszont már referencia típus. De a string immutable típusnak van definiálva. Ez azt jelenti, hogy ha megváltoztatom (pl: s = s.Replace ("régi szövegrész", "új szöveg "); ) akkor az egész lemásolódik egy új memóriaterületre úgy hogy ott már módosítva lesz (kicseréli a szövegrészt) és az eredeti változónk egyszerűen átmutat az új helyre (referencia). Ref és value type-ok azaz referencia és érték típus (ld. GC "kicsi" ref típusokat tömöríti, nagyokat hagyja, érték típusúak stacken képződnek) Értékadás Érték típusnál másolat képződik Referencia típusnál ugyanarra memóriára mutatnak (lehet null érték)
.Net előadás jegyzet – 2. óra ( C# 2-ben nullable = mégis kaphatnak null-at az érték típusúak pl: int? i ) Class és struct közötti különbség class – ref. típusú struct – érték típusú Példa. Mit ír ki: +++ class RefTypeEx { public RefTypeEx() { } public int i; }; struct ValueTypeEx { public int i; }; private static void TipusExample() { Console.WriteLine("referencia típus."); RefTypeEx r = new RefTypeEx(); r.i = 1; RefTypeEx rr = r; rr.i = 2; Console.WriteLine("eredeti: " + r.i); Console.WriteLine("értékadás bal oldala: " + rr.i); Console.WriteLine(); Console.WriteLine("érték típus."); ValueTypeEx v = new ValueTypeEx(); v.i = 1; ValueTypeEx vv = v; vv.i = 2; Console.WriteLine("eredeti: " + v.i); Console.WriteLine("értékadás bal oldala: " + vv.i); } +++
Tömbök //Refactor menü (ld később) int [ ] intArray = new int[32] for ciklus (ld. c++) ÚJ: intArray[32]=0 //védett biztonságosabb, mert nem engedi meg a túl indexelést (Managed) Példa: +++
4.oldal
.Net előadás jegyzet – 2. óra
5.oldal
private static void Arrays() { int[] intArray = new int[32]; for (int i = 0; i < intArray.Length; i++) { intArray[i] = i; } for (int i = 0; i < intArray.Length; i++) { Console.Write(intArray[i].ToString() + ", "); } //Elszáll: //intArray[32] = 0; } +++ Konverziók Kiiratásnál nincs explicit konverzió alapban, de .ToString() metódus minden változónak van! (System.Object-től öröklik) Equals metódus szintén Object-ból származik ahol referencia szerint hasonít össze 2 elemet pl: String öröklődik az Obj.ból és az Equals metódus felüldefiniálható, hogy betűket hasonlítsa GetHashCode = kulcsra hivatkozott hasonlítás (object-ből származik ,felüldefiniálható) GetTye = futás idejű típust adja vissza (Type -ban) (object-ből származik) String - int konverzió: String sVal=”123”; int parsed=int.Parse(sVal); Console.Writeline(parsed); //int.TryParse() //Beolvasott String szám e? Nem dob Exceptiont, ha 100000 számot (és néha mást) kell átkonvertálni Példa: +++ private static void ConvertF() { string str = "ez egy string"; Console.WriteLine(); Console.WriteLine("konverziok."); int j = 1; string strInt = j.ToString(); Console.WriteLine(strInt); object o; Console.WriteLine(j.GetType()); string sVal = "1243"; statikus metódus hívás int parsed = int.Parse(sVal); int.TryParse( Console.WriteLine(parsed); Convert.ToInt16(
// // // } +++
Másik lehetőség: Convert.ToInt16()
.Net előadás jegyzet – 2. óra
6.oldal
Enum - Felsorolási típus Automatikusan 0-tól egyesével sorszámozódik, de adhatunk direktbe más értéket neki Enum FelsorTip { F1, F2, F3=42}; FelsorTip f = FelsorTip.F1; Példa: +++ private static void FelsorTipusok() { FelsorTipus f = FelsorTipus.F1; Console.WriteLine(f); Console.WriteLine((int)f); FelsorTipus f3 = FelsorTipus.F3; Console.WriteLine((int)f3); } +++
Alapvető programkonstrukciók If (felt ) [ut/blokk] else [ut/blokk] feltételek: (ld C++) && || != == switch, case switch (kif) { case "a": Console.WriteLine("aa"); break; //"a" lehet String a case feltétele, a break nem hagyható el (csak ha nincs kód) } for – szokásos foreach –ha enum interfacet implementálják foreach(int f in intArray){ Console.Write(f);} //enum interfacet implementálják. Bejár egy Collectiont /tömböt/ intArray.Length a tömb elemszámát adja vissza continue; break; használható (ld. C++) Példa: +++ private static void ProgKonst() { int i = 1; RefTypeEx r = new RefTypeEx(); if (i == 1 && r != null) { } else { } string s = "s"; switch (s)
.Net előadás jegyzet – 2. óra { case "a": Console.WriteLine("aa"); break; case "b": case "c": Console.WriteLine("bb"); break; default: Console.WriteLine("def"); break; } int[] intArray = new int[32]; for (int j = 0; j < intArray.Length; j++) { intArray[j] = j; //continue; //break; } foreach (int f in intArray) { Console.Write(f); } } +++
Osztályok függvények, metódusok, member változók, static Pl: +++ class ExampleClass { public ExampleClass(int i) //konstruktor { this.i = i; } public int Lekerdezo() { return i; } public void SetValue(int j) { i = j; q = j; } public static void StaticFunc(int qq) { q = qq;
7.oldal
.Net előadás jegyzet – 2. óra
8.oldal
// nem adhat értéket nem static memberváltozónak } private int i; private static int q = 1; } +++ Main-be: ExClass exCl=new ExClass(2); Új sor karakter: "\n" (ld. C++) Static class Csak statikus változók. Statikus fv. – csak statikus változókkal. Statc constructor első hivatkozáskor fut le. Példányosítani nem lehet, 1 van belőle. Paraméterátadási módok (alapért, out, ref)
érték szerint átadási mód: ref-t adjuk át mint értéket, csak obj. belül tudjuk megváltoztatni. kívülről nem tükröződik a referencia változtatása ref szerint átadási mód: ref értkre alkalmazható másolat készül róla. Kívülről tükröződik az érték típusokváltoztatása csak kifele menő: nem érdekel mi megy be felülírja
Pl. +++ public void RRRValue(RefTypeEx r) { //kinn is latszani fog r.i = 1; //nem fogja a kinti valtozok felulvagni r = new RefTypeEx(); } public void VVVValue(ValueTypeEx v) { //kinn nem fog laszodni a kov ertekadas eredmenye v.i = 1; //nem fogja a kinti valtozok felulvagni v = new ValueTypeEx(); } public void VVVRef(ref ValueTypeEx v) { //kinn is latszani fog v.i = 1; //felulvagja a kinti valtozot v = new ValueTypeEx(); }
.Net előadás jegyzet – 2. óra
9.oldal
public void RRROut(out RefTypeEx r) { //kinn is latszani fog r = new RefTypeEx(); //kinn is latszani fog r.i = 1; } +++ operátor overloading láthatóság (ld C++) Láthatóság namespace Classes { class MyClass { … }; } MyClass-nál: private alapban, ilyenkor senki sem látja a namespacen kívűl (akkor sem ha uaz a namespace, vagy file) public esetén mindenki látja internal esetén tetszőleges namespace-ben lát az adott modulon(fájlon) belül
Pl: +++ //csak abból a modulból látható ahol definiálva van internal class X { } // (sealed kulcsszó) nem lehet belőle származtatni sealed class Sealed { } // nem lehet példányt létrehozni belőle, //csak abból a leszármazottból (ami nem abstrakt) és minden metódusa implementálva van abstract class Abs { abstract public void AbsFunc(); public void ImplementáltMetódus() { } }
.Net előadás jegyzet – 2. óra
10.oldal
+++
C-Sharp nyelv alapjai 1. ................................................................................................................... 1 Egyszerű példák ....................................................................................................................... 1 Típusok ..................................................................................................................................... 3 Alapvető programkonstrukciók ................................................................................................ 6 Osztályok .................................................................................................................................. 7