Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 43

Ιστορία του .

NET
Έτος Έκδοση
2002 1.0, Visual Studio .NET, Windows Forms, ASP.NET
2003 1.1, Visual Studio .NET 2003
2005 2.0, Visual Studio 2005, υποστήριξη generics, anonymous methods
2006 3.0, WPF, WCF, WF
2007 3.5, Visual Studio 2008, LINQ
2010 4.0, Visual Studio 2010, Parallel Extensions, TPL
2012 4.5, Visual Studio 2012
2014 4.6, Visual Studio 2016
2016 .NET Core 1.0, Visual Studio 2017
2017 4.7, .NET Core 2.0
2018 4.8 (TBA), .NET Core 3.0 (TBA), Visual Studio 19 (TBA)
Τι είναι;

• Οικοσύστημα πολλαπλών εργαλείων και τεχνολογιών


• Οι υποστηριζόμενες γλώσσες μεταγλωττίζονται σε byte-code
και εκτελούνται
• Γενικής χρήσης, όχι μόνο web
• Εξαιρετικά πλούσια βιβλιοθήκη με βοηθήματα για κάθε
σκοπό
• Η γλώσσα προγραμματισμού C# είναι η πιο διαδεδομένη
Πώς ξεκινάμε;

• Visual Studio IDE


• Solution file, projects + αρχεία κώδικα
• Εκτέλεση και αποσφαλμάτωση μέσα από το IDE
• Εναλλακτικός τρόπος είναι μέσω του dotnet CLI
Πώς ξεκινάμε (CLI);

• Άνοιγμα command line (π.χ. Bash terminal, PowerShell, cmd,


etc)
• Αλλαγή στο directory όπου αποθηκεύουμε όλα μας τα projects
π.χ. cd ~/Projects
• mkdir <ProjectDirName>
π.χ. mkdir CollegeLink
• dotnet new mvc -n <ProjectName> -o
<ProjectDirName>
π.χ. dotnew new mvc -n Academy -o CollegeLink
• Εκτελούμε με:
dotnet run
ASP.NET MVC
• Στατικά assets
• Razor pages
• Κώδικας που εκτελείται στο server

Εισερχόμενο
Εκτέλεση κώδικα στο Εφαρμογή Razor View
HTTP Τελικό Response
server Engine
Request
ASP.NET MVC

Web Server
Controller/Action View
(Kestrel, IIS)

Το View κάνει
Model χρήση του Model
DB
που ανακτάται
από τον Controller
ASP.NET MVC Web Project

• Δημιουργία νέου web project με το Visual Studio ή το


dotnet CLI
• Παραμετροποίηση του έργου μέσω του αρχείου
Startup.cs
• Τροποποίηση και επέκταση του example site με βάση τις
ανάγκες μας
• Ένα controller/action/view ανά URL
• Διαμόρφωση του Razor view για την προβολή της σελίδας
Razor View

• Κατά 90% απλή HTML


• Συνοδεύεται από δεδομένα (Model), που είναι ένα C#
αντικείμενο
• Μέσω του χαρακτήρα @ αποκτάμε πρόσβαση στο Model ώστε
να μπορέσουμε να τυπώσουμε τα δεδομένα του
• Π.χ. @Model.FirstName
• Μέσω των Tag Helpers εμπλουτίζουμε το τελικό HTML που
τυπώνεται με τη βοήθεια του server
Controller/Action

• Καλείται στα πλαίσια ενός request


• Το ποιο ζεύγος controller/action θα κληθεί εξαρτάται από το
URL και τη δρομολόγηση που γίνεται αυτόματα από το
ASP.NET MVC framework
• Οφείλει να προετοιμάσει το model με όποιον τρόπο είναι
απαραίτητο (κλήσεις προς databases, άλλη επεξεργασία)
• Συνήθως καταλήγει σε:

return View(model);

• Αλλά μπορεί να είναι Redirect, Json, κ.α.


Hello World!

class Hello
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
Βασικές Ιδέες της C#

• Γενικής χρήσης
• Πλήρως αντικειμενοστραφής (object-oriented)
• Επηρεασμένη κυρίως από Java και ML/LISP
• Μεταγλωττίζεται σε IL και άρα τρέχει σε όλες τις πλατφόρμες
που μπορεί να τρέξει το .NET (Core)
• Παράγει .NET Assembly
• Αυτόματη διαχείριση μνήμης
• Ιδιότητες (properties) και συμβάντα (events)
• Generics
• Διαχείριση εξαιρέσεων
• Ασύγχρονος κώδικας
Αντικείμενα
• Ο ακρογωνιαίος λίθος του αντικειμενοστραφούς προγραμματισμού
• Διαθέτουν «κατάσταση» (state) και «συμπεριφορά» (behavior)
• Αποθηκεύουν την κατάστασή τους σε «πεδία» («μεταβλητές» σε κάποιες
άλλες γλώσσες) και επιδεικνύουν συμπεριφορά μέσω «μεθόδων»
(«συναρτήσεων» σε κάποιες άλλες γλώσσες)
• Αποκρύπτουν την εσωτερική τους κατάσταση και απαιτούν όλη η
αλληλεπίδραση με εκείνα να γίνεται μέσω των μεθόδων τους
(«ενθυλάκωση»)

Παράδειγμα:
Ένα ποδήλατο έχει ως κατάσταση την τρέχουσα ταχύτητα (γρανάζι) και
διαθέτει ως μέθοδο την αλλαγή αυτής. Για ποδήλατο 6 ταχυτήτων, η μέθοδος
αυτή δεν επιτρέπει τιμές έξω από το όριο του 1 και 6.
Κλάσεις
• Μια κατηγορία ομοειδών αντικειμένων
• Λειτουργεί ως το «καλούπι» από το οποίο δημιουργούνται όλα τα ομοειδή αυτά αντικείμενα
• Περιγράφει τα πεδία και τις μεθόδους των αντικειμένων αυτών
• Τα αντικείμενα μιας κλάσης λέγονται επίσης και «περιπτώσεις» (instances) της κλάσης αυτής

Παράδειγμα: το ποδήλατο

class Bicycle
{
private byte _gear;
public byte GetGear() { return _gear; }
public void SetGear(byte newGear)
{
if (newGear > 0 && newGear < 7)
_gear = newGear;
}
}
Ορατότητα
• Τύποι: public, protected, internal, protected internal, ή private
• Εφαρμόσιμο στις κλάσεις, στις μεθόδους, στα πεδία, στις ιδιότητες και στα συμβάντα

• Public: προσβάσιμο από οποιοδήποτε κώδικα οποιουδήποτε assembly


• Protected: προσβάσιμο από κώδικα της ίδιας κλάσης, ή άλλης κλάσης-κληρονόμου
• Internal: προσβάσιμο από οποιοδήποτε κώδικα του ίδιου assembly, αλλά όχι από κώδικα άλλου assembly
• Protected Internal: προσβάσιμο από κώδικα του ίδιου assembly, ή από κλάση-κληρονόμο άλλου assembly
• Private: προσβάσιμο μόνο από κώδικα της ίδιας κλάσης

• Με τη διαβαθμισμένη ορατόιτητα επιτυγχάνουμε την «απόκρυψη της πληροφορίας» και συνεπώς την
«ενθυλάκωση»

public class Foo


{
private int state = 42;
internal int moreState;

public void Process() { … }


protected void ProcessHelper() { … }
}
Κατασκευαστές (Constructors)
class Foo
{
// Πρόσβαση – όνομα κλάσης - ορίσματα
public Foo()
{
// Κώδικας αρχικοποίησης
// …
}
public int state;
public void Process() { … }
}

// Δημιουργία νέου αντικειμένου


Foo obj = new Foo();
// Πρόσβαση σε πεδία και μεθόδους
Console.WriteLine(obj.state);
obj.Process();
Namespaces
• Ορίζει ένα χώρο μέσα στον οποίο ομαδοποιούνται σχετικές κλάσεις
• Μέσα στο χώρο αυτό δε μπορεί να υπάρχει σύγκρουση ονομάτων
• Παρόμοιο σε σύλληψη με ένα φάκελο αρχείων στο δίσκο

namespace Vehicles.Bicycles
{
public class Bicycle
{
// Υλοποίηση της κλάσης
}
public class MountainBike
{
// Υλοποίηση της κλάσης
}
}

// Χρήση
// Fully qualified
var b = new Vehicles.Bicycles.Bicycle();
using Vehicles.Bicycles; // Φόρτωση namespace
var mb = new MountainBike(); // Χωρίς αναφορά στο namespace
Πεδία
class Foo
{
// Πρόσβαση – τύπος – όνομα (αρχική τιμή)
private int field = 42;
}
Μέθοδοι
class Foo
{
// Πρόσβαση – τύπος – όνομα - ορίσματα
public int Process(string input)
{
// …
return 42;
}
}
Ιδιότητες
class Foo
{
public int state;
public int State
{
get { return state; }
set { state = value; }
}
}
Attributes
[ClassAttribute]
class Foo
{
[MethodAttribute(param1=“value1”)]
public void DoProcess()
{
}
}
Μεταβλητές
class Foo
{
public void Process()
{
// Explicit typing
string x;
// Με αρχική τιμή
string y = "foo";
// Implicit typing
var z = "baz";
}
}
Εμβέλεια μεταβλητών

● Κλάσης (class level)

● Μεθόδου (method level)

● Μπλοκ (block level)


Εμβέλεια μεταβλητών
class Foo
{ // Έναρξη εμβέλειας κλάσης
int bar = 42;

public void Process()


{ // Έναρξη εμβέλειας μεθόδου
int baz = 1978;
Console.WriteLine(bar); // OK
Console.WriteLine(baz); // OK
if (true)
{ // Έναρξη εμβέλειας μπλοκ
int k = 1789;
Console.WriteLine(k); // OK
} // Λήξη εμβέλειας μπλοκ
Console.WriteLine(k); // Σφάλμα
} // Λήξη εμβέλειας μεθόδου

public void Another()


{ // Έναρξη εμβέλειας μεθόδου
Console.WriteLine(baz); // Σφάλμα
} // Λήξη εμβέλειας μεθόδου
} // Λήξη εμβέλειας κλάσης
Στατικά μέλη

• Ανήκουν στην κλάση αντί σε κάποιο συγκεκριμένο αντικείμενο

• Υπάρχει μόνο ένα αντίγραφο, ανεξαρτήτως πόσα αντικείμενα


της κλάσης μπορεί να έχουν δημιουργηθεί

• Στατικές μέθοδοι και ιδιότητες δε μπορούν να προσπελάσουν


μη-στατικά πεδία της κλάσης τους
Τύποι δεδομένων

● String – string
● Character - char
● Integer - int
● Float - float
● Boolean - bool
● Object – object

● Και άλλοι αριθμητικοί τύποι διαφόρων μεγεθών (byte, short, double, long)
● Όταν μια μέθοδος δεν επιστρέφει κάτι, ο τύπος της είναι void
● Arrays – όνομα τύπου + [], π.χ. int[]
Αριθμητικοί Τελεστές
Τελεστής Πράξη Παράδειγμα

- Αφαίρεση x-y

+ Πρόσθεση x+y

* Γινόμενο x*y

/ Πηλίκο διαίρεσης x/y

% Υπόλοιπο διαίρεσης x%y


Τελεστές Εκχώρησης

Τελεστής Πράξη Παράδειγμα

= Εκχώρηση τιμής x = 15

+= Πρόσθεση x += 2

-= Αφαίρεση x -= 5

*= Γινόμενο x *= 2

/= Πηλίκο διαίρεσης x /= 2

%= Υπόλοιπο διαίρεσης x %= 2
Τελεστές Σύγκρισης
Τελεστής Πράξη Παράδειγμα
== Ίσο x == y
!= Διάφορο x !=y
< Μικρότερο x<y
> Μεγαλύτερο x>y
<= Μικρότερο ή ίσο x <= y
>= Μεγαλύτερο ή ίσο x >= y
Τελεστές αύξησης/μείωσης

Τελεστής Εντολές Παράδειγμα

++ Αύξηση κατά 1 και ++x


επιστροφή τιμής
Επιστροφή τιμής και x++
αύξηση κατά 1
-- Μείωση κατά 1 και --x
επιστροφή τιμής
Επιστροφή τιμής και x--
μείωση κατά 1
Λογικοί τελεστές

Τελεστής Πράξη Παράδειγμα

&& AND x && y

|| OR x || y

^ XOR x^y

! NOT !x

?: TEST isValid ? "yes" : "no"


Τελεστές συναρτήσεων

Τελεστής Πράξη Παράδειγμα

() Εφαρμογή f(x)

=> Δημιουργία ανώνυμης x,y => x + y


συνάρτησης (λ)
Άλλοι τελεστές

Τελεστής Πράξη Παράδειγμα

. Πρόσβαση μέλους x.y

[] Ευρετηριωμένη x[y]
πρόσβαση
new Αρχικοποίηση var x = new Foo()
αντικειμένου
(T)x Μετατροπή τύπου (int)x

delegate Δημιουργία delegate delegate int del(int x)


Προτεραιότητα τελεστών

https://docs.microsoft.com/en-us/dotnet/csharp/language-
reference/operators/

• Συμπεριλαμβάνονται και τελεστές που δεν έχουμε παρουσιάσει


ως τώρα
Δομή ελέγχου ροής if...elseif...else

if (συνθήκη_1) if (x > 0)
{ {
a = “positive”;
} }
else if (συνθήκη_2) else if (x < 0)
{ {
a = “negative”;
} }
else else
{ {
a = “zero”;
} }
Δομή ελέγχου ροής switch

switch (μεταβλητή) { switch (x) {


case τιμή1: case 1:
a = “one”;
break; break;
case τιμή2: case 2:
a = “two”;
break; break;
default: default:
a = “not one or
} two”;
}
Δομή επανάληψης while

while (συνθήκη) while (x-- > 0)


{ {
a *= 2;
}
}
Δομή επανάληψης for

for (αρχικοποίηση; συνθήκη; τελευταία_εντολή) {

for (int i = 0; i < 10; i++) {


a *= 2;
}
Δομή προσπέλασης foreach
foreach (var στοιχείο in δρομέας) {

foreach (var item in list) {


Console.WriteLine(item.Name);
}
Πρόσβαση σε βάσεις δεδομένων

● Με χρήση API χαμηλού επιπέδου (System.Data.*)

● Με χρήση 3rd party βιβλιοθηκών

● Με χρήση του Entity Framework Core και τον κατάλληλο driver


Entity Framework Core

● O/RM

● “Κρύβει” την ανάγκη για χαμηλού επιπέδου επικοινωνία με το


database server μέσω της παρεχόμενης δομής DataContext

● Διαθέσιμοι drivers για τις περισσότερες γνωστές τεχνολογίες βάσεων


δεδομένων

using (var db = new DataContext())


{
Console.WriteLine(db.Blogs.Count()); // n
db.Blogs.Add(new Blog { Title = “My blog”, Url = “…” });
db.SaveChanges();
Console.WriteLine(db.Blogs.Count()); // n + 1
}
Entity Framework Core (MySQL)
● dotnet add package Pomelo.EntityFrameworkCore.MySql
dotnet add package Microsoft.EntityFrameworkCore.Design

● dotnet ef dbcontext scaffold "<connection string>"


Pomelo.EntityFrameworkCore.MySql -o Models -c WdaContext

Startup.cs:

public void ConfigureServices(IServiceCollection services)


{
// … Other services here
services.AddDbContext<WdaContext>();
}
Χρήσιμοι σύνδεσμοι

● C# Guide (Microsoft):
https://docs.microsoft.com/en-us/dotnet/csharp/index

● C# Tutorial:
https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/

● ASP.NET Core MVC Tutorial:


https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-
app/?view=aspnetcore-2.2

● Entity Framework Core Tutorial:


https://docs.microsoft.com/en-us/ef/core/get-started/

You might also like