[C#-Grundlegende Erklärung] (12) Klasse

12.1 Klassen und Objekte

Wir beschreiben ein Objekt im Code , indem wir die Eigenschaften und Methoden des Objekts beschreiben . Das Objekt muss sichtbar und greifbar sein.

Zum Beispiel:

Lampe: hat Eigenschaften und Methoden

Eigenschaften: Form: rund; Stromverbrauch: 500 W; Farbe: Weiß; Marke: xx

Methode: Glow

Elektrischer Ventilator: hat Eigenschaften und Methoden

Attribute: Form: drei Blätter; Farbe: weiß; Marke: xx

Methode: Drehen, Fächern

Wir kapseln diese Objekte weiter mit denselben Attributen und Methoden und abstrahieren das Konzept der „Klasse“ .

Eine Klasse ist eine Zeichnung , die die Eigenschaften und Methoden eines Objekts bestimmt , und das Objekt wird basierend auf der Klasse erstellt.

Eine Klasse ist ein Bauplan für den Bau eines Gebäudes und ein Objekt ist ein Gebäude, das gebaut wird.

12.2 Klassensyntax

[öffentliche] Klasse <Klassenname>

{

        Feld (Feld);

        Eigentum (Eigentum);

        Methode (Methode);

}

         Attribute und Felder sind unterschiedliche Namen für dasselbe Element. Ein Feld ist aus Datenbanksicht ein Name, es kann auch als Attribut bezeichnet werden, und ein Attribut ist aus objektorientierter Sicht ein Name.        

        Nachdem wir eine Klasse geschrieben haben, müssen wir das Schlüsselwort new verwenden, um ein Objekt dieser Klasse zu erstellen. Wir nennen den Prozess zum Erstellen dieser Klasse Instanziierung, und dies: stellt das aktuelle Objekt dieser Klasse dar. Klassen beanspruchen keinen Speicher, Objekte jedoch schon.

12.3 Eigenschaften

1. Einleitung:

        Eigenschaften sind eine natürliche Erweiterung von Feldern . Aus Sicht der Benennung ähneln Felder eher dem Layout von Instanzobjekten im Speicher. Attribute neigen eher dazu, die Eigenschaften realer Objekte widerzuspiegeln. Die Funktion des Attributs besteht darin, das Feld zu schützen und die Zuweisung und den Wert des Feldes einzuschränken. Das Wesentliche des Attributs sind zwei Methoden, eine heißt get und die andere heißt set.

        Vorschlag: Verwenden Sie zum Offenlegen von Daten immer Attribute (anstelle von Feldern), d. h. Felder sind immer privat oder geschützt

2) Grammatik:

öffentliche Rückgabetypkennung

{

        get{ Ausgabewert zurückgeben; } Accessor, um den Wert für die Eigenschaft abzurufen

        set { ask = value; } Accessor weist einer Eigenschaft einen Wert zu

}

Es gibt sowohl get als auch set, die wir als lesbare und beschreibbare Attribute bezeichnen

Wir nennen es nur „get“ und „no set“ schreibgeschütztes Attribut

Es gibt kein „Get“, sondern nur „Set“, das wir „Nur-Schreiben“-Attribute nennen. Nur-Schreiben-Attribute kommen selten vor und werden oft verwendet, um den Zugriff auf sensible Daten einzuschränken

Tastenkombinationen für Kapselungseigenschaften: Strg+R+E

Bei der Durchführung einer Wertbegrenzung ( Zuweisung         ) verwendet der Parameter den Wert , und bei der Durchführung einer Wertbegrenzung (Ausgabewert) verwendet der Parameter das Feld .

Beispiel:

privater String-Name;

öffentlicher String-Name

{

        get{Rückgabename;}

        set{name=wert;}

}

3) neues Schlüsselwort:

Person zs Person = neue Person();

new hilft uns, drei Dinge zu tun:

① Öffnen Sie einen Platz im Gedächtnis

② Erstellen Sie Objekte im geöffneten Raum

③ Rufen Sie den Konstruktor des Objekts auf, um das Objekt zu initialisieren

 4) dieses Schlüsselwort:

Ein Objekt, das die aktuelle Klasse darstellt.

Der Konstruktor dieser Klasse wird in der Klasse aufgerufen: this.

 5) Attributübung: Erstellen Sie im selben Namespace eine neue Person-Klasse, um den vom Benutzer zugewiesenen Namen, das Geschlecht und das Alter zu bestimmen. Wenn das Geschlecht nicht als männlich/weiblich zugewiesen ist, ist der Standardwert mittel. Wenn das Alter niedriger ist größer als 0 oder größer als 100 ist, ist der Standardwert 0.

//首先在Person类下封装属性,写方法:
public class Person
{
    private string _name;
    public string Name
    {
        //当你输出属性的值得时候 会执行get方法
        get { return _name; }
        //当你给属性赋值的时候 首先会执行set方法
        set { _name = value; }
    }
    private int _age;
    public int Age
    {
        get { return _age; }
        set
        {
            if (value < 0 || value > 100)
            {
                value = 0;
            }
            _age = value;
        }
    }    
    private char _gender;
    public char Gender
    {
        get
        {
            if (_gender != '男' && _gender != '女')
            {
                return _gender = '中';
            }
            return _gender;
        }
        set { _gender = value; }
    }
    public void Say()
    {
        Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,我	可以说话", this.Name,     this.Age, this.Gender);
    }
}
//再在Main函数实例化Person对象,并赋值:
class Program
{
    public static void Main(String[] args)
    {
        Person p = new Person();
        p.Name = "张三";
        p.Age = 20;
        p.Gender = '女';
        p.Say();
        Console.ReadKey();
    }
}

Operationsergebnis:

Mein Name ist Zhang San, ich bin 20 Jahre alt, ich bin ein Mädchen, ich kann sprechen

12.4 Konstrukteure

1) Einführung in den Konstruktor:

        Erstens handelt es sich um eine Methode (Funktion), da sie die Funktion „Konstruktion“ hat und daher als Konstruktor (Konstruktionsmethode) bezeichnet wird . Ein Konstruktor ist eine Mitgliedsfunktion mit demselben Namen wie eine Klasse . Normalerweise wird der Konstruktor in der Klasse verwendet, um die Mitgliedseigenschaften der Klasse zu initialisieren, und der Rückgabetyp ist nicht enthalten.

Funktion: Wird beim Erstellen des Instanzobjekts automatisch aufgerufen und kann initialisiert werden.

Warum initialisieren?

Wir können viele Instanzobjekte aus einer Klasse instanziieren, und jedes Objekt muss einige Attribute festlegen.

Weisen Sie Werte auf folgende Weise zu:

object1.property1 = value1;

object1.property2 = value2;

object2.property1 = value3;

object2.property2 = value4;

Beim Instanziieren vieler Objekte wird es viel sich wiederholenden Code geben

Daher verwenden wir den Konstruktor, um das Objekt zu initialisieren und weisen ihn zu, wenn das Objekt zum ersten Mal instanziiert wird.

folgendermaßen:

classNameObject1 = neuer Klassenname(Wert1, Wert2)

classNameObject2 = neuer Klassenname(Wert3, Wert4)

prägnant und elegant

2) Die Syntaxanforderungen des Konstruktors:

öffentlicher Klassenname([Parameter])

{

        Konstruktorcode;

}

Notiz:

① Der Konstruktor muss den öffentlichen Modifikator verwenden, nicht privat, öffentlich: öffentlich und öffentlich und kann überall aufgerufen werden. privat: privat, der Zugriff kann nur innerhalb der aktuellen Klasse erfolgen, mit Ausnahme dieser Klasse.

② Der Konstruktor ist eine spezielle Funktion zum Erstellen eines Objekts. Der Funktionsname ist derselbe wie der Klassenname, es gibt keinen Rückgabewert und selbst void muss nicht geschrieben werden.

③ Konstruktoren können Parameter haben. Wenn neue Objekte übergeben werden, können Funktionsparameter übergeben werden. Wenn das Objekt erstellt (neu) wird, wird der Konstruktor ausgeführt.

④ Der Konstruktor hat keinen Rückgabewert, daher ist es nicht erforderlich, vor dem Funktionsnamen void, int, string und andere Rückgabewerttypen hinzuzufügen.

⑤ Der Konstruktor kann weder vererbt noch überschrieben werden. Aber die Unterklasse kann den Konstruktor der übergeordneten Klasse über base() aufrufen.

⑥ Der Konstruktor kann überladen werden: Wir müssen keinen Konstruktor definieren und das System verwendet den integrierten leeren Konstruktor. Wenn Sie einen neuen Konstruktor schreiben, unabhängig davon, ob er ohne Parameter ist oder nicht, wird der standardmäßige Konstruktor ohne Parameter eliminiert. Wenn eine Klasse mehr als zwei Konstruktoren enthält, kann dies als überladener Konstruktor betrachtet werden.

Das Folgende ist ein leerer Konstruktor:

öffentlicher Klassenname()

{

        schreibe hier nichts

}

Wenn wir ein Objekt instanziieren, gibt es zwei Möglichkeiten :

        ① Rufen Sie den parameterlosen Konstruktor auf, um das Objekt zu instanziieren

        Leute p1 = neue Leute();

        ② Rufen Sie den Konstruktor mit Parametern auf, um das Objekt zu instanziieren

        Personen p1 = neue Personen("Zhang San", 20, "Student");

3) Konstrukteursübung 1:

Schreiben Sie eine Ticketklasse mit einem Entfernungsattribut (dieses Attribut ist schreibgeschützt und wird in der Konstruktionsmethode zugewiesen), das nicht negativ sein darf, und einem Preisattribut, das schreibgeschützt ist, und berechnen Sie den Preispreis (1 Yuan/km). ) entsprechend der Entfernung:

Auf die Fahrpreise von 0 bis 100 Kilometern wird keine Ermäßigung gewährt

101 - 200 km insgesamt 15 % Rabatt

10 % Rabatt auf die Gesamtstrecke für 201–300 Kilometer

20 % Rabatt auf die Gesamtstrecke von mehr als 300 Kilometern

//首先写ticket类:
public class Ticket
{
    private double distance;
    public double Distance
	{
        get { return distance; }
    }
    //构造函数
    public Ticket(double distance)
    {
        if (distance < 0)
        {
            distance = 0;
        }
        this.distance = distance;
    }
    private double price;
    public double Price
    {
        get
        {
            if (distance > 0 && distance <= 100)
            {
                price = distance * 1.0;
                return price;
            }
            else if (distance >= 101 && distance < 200)
            {
			    price = distance * 0.95;
				return price;
            }
            else if (distance >= 201 && distance < 300)
            {
                price = distance * 0.9;
                return price;
            }
            else
            {
                price = distance * 0.8;
                return price;
            }
        }
    }
    public void ShowTicket()
    {
        Console.WriteLine("{0}公里需要{1}元", Distance, Price);
    }
}
//再在Main函数中调用有参数的构造函数实例化对象:
class Program
{
    public static void Main(String[] args)
    {
        Ticket t = new Ticket(358);
        t.ShowTicket();
        Console.ReadKey();
    }
}

Ausgabeergebnis:

358 Kilometer brauchen 286,4 Yuan

4) Konstruktorübung 2: Schreiben Sie eine Student-Klasse, die 4 Datenelemente enthält: Name, Geschlecht, Alter, Schule und mehrere Elementfunktionen . Schreiben Sie gleichzeitig die Hauptfunktion, um mit dieser Klasse die Zuweisung und Ausgabe von Schülerdaten zu realisieren.

Anforderungen: Verwenden Sie Mitgliedsfunktionen, um Daten auszugeben (relevante Informationen der Schüler anzuzeigen); verwenden Sie Konstruktoren, um Daten einzugeben (mehrere Konstruktoren können überladen und verwendet werden).

//首先在Student类中编写:
    public class Student
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private string gender;
        public string Gender
        {
            get { return gender; }
            set
            {
                if (value != "男" && value != "女")
                {
                    value = "中";
                }
                gender = value;
            }
        }

        private int age;
        public int Age//设为属性
        {
            get { return age; }//得到  return返回值
            set //设置判断的条件,规定该属性的正确要求
            {
                if (value < 0 || value > 100)
                {
                    value = 18;
                }
                age = value;
            }
        }
        private string school;
        public string School
        {
            get { return school; }
            set { school = value; }
        }
        public void ShowStudent()
        {
            Console.WriteLine("该学生姓名为:{0},性别为{1}生,年龄为{2}岁,学校为{3}", Name, gender, Age, School);
        }
        public Student(string name, string gender, int age, string school)
        {
            this.Name = name;
            this.Gender = gender;
            this.Age = age;
            this.School = school;
        }
        public Student(string name, string gender)
        {
            this.Name = name;
            this.gender = gender;
        }
    }

//再在Main函数中实例化新的对象:
    class Program
    {
        public static void Main(String[] args)
        {
            Student s1 = new Student("小丽", "女", 22, "南昌大学");
            s1.ShowStudent();
            Student s2 = new Student("张三","未知");
            s2.ShowStudent();
            Console.ReadKey();
        }
    }

Ausgabeergebnis:

Der Name der Schülerin lautet: Xiaoli, ihr Geschlecht ist Mittelschülerin, sie ist 22 Jahre alt und ihre Schule ist die Nanchang-Universität

Der Name des Schülers ist: Zhang San, Geschlecht ist unbekannt, Alter ist 0 Jahre alt, Schule ist

12.5 Destruktoren

1) Einführung in den Destruktor:

        Sie können Methoden namens Destruktoren definieren, die aufgerufen werden, bevor der Garbage Collector das Objekt endgültig zerstört. Wenn das Programm endet, wird der Destruktor ausgeführt, um uns bei der Freigabe von Ressourcen zu helfen. Wenn der Destruktor nicht geschrieben ist, bereinigt GC (Garbage Collection Garbage Collector) automatisch Ressourcen und gibt sie frei.

        Was bedeutet das? Normalerweise verwenden wir Konstruktoren häufiger, da das Programm jedes Mal, wenn wir ein Objekt erstellen, automatisch den Konstruktor im Objekt aufruft und so dynamisch einen Speicherblock für das Objekt öffnet. Aber haben Sie schon einmal darüber nachgedacht, was zu tun ist, wenn der Speicher nicht aufgebraucht ist? Es muss einen Recyclingmechanismus geben, um freien Speicher zurückzugewinnen.

        C# verfügt über einen eigenen Garbage-Collection-Mechanismus. Dieser „Müll“ umfasst freien Speicher, und der Programmierer muss den Speicherplatz nicht manuell freigeben. Dies erfolgt automatisch, aber es gibt eine schlechte Sache! Es geschieht automatisch und zufällig, nicht jedes Mal, wenn Sie das Programm ausführen, muss es recycelt werden, es hängt von Ihrer Stimmung ab.

        Der Destruktor ist eine Funktion, die ausgeführt wird, bevor Ihr Objekt zerstört wird, dh eine Funktion, die aufgerufen wird, bevor die Speicherbereinigung abgeschlossen ist. Bevor Sie den Speicher freigeben, können Sie in den Destruktor schreiben und schreiben, was Sie erreichen möchten.

2) Destruktorsyntax:

~className()

{

        Codekörper;

}

Hinweis: Der Destruktor darf keine Parameter haben; der Destruktor hat keinen Rückgabewert und keinen Zugriffsmodifikator; der Destruktor wird vom System aufgerufen; der Destruktor ist optional; der Destruktor wird aufgerufen, wenn das Programm beendet wird.

Geben Sie Ressourcen frei GC (Garbage Collection) Garbage Collector.

Ich denke du magst

Origin blog.csdn.net/Y1RV1NG/article/details/131033950
Empfohlen
Rangfolge