Javaer fasst zusammen, wie C # -Eigenschaften geschrieben werden

Einführung

Die erste Programmiersprache, die ich gelernt habe, war Java, aber ich habe das Konzept und das Schreiben von C # -Eigenschaften nicht wirklich verstanden, deshalb möchte ich es organisieren.

Wer ist das Ziel dieses Artikels?

Vergleich des Schreibstils

Annahme

Betrachten Sie die ** menschliche Klasse **, die in objektorientierten Erklärungen häufig vorkommt. Angenommen, die Klasse Mensch hat die folgenden Felder und Sichtbarkeiten:

--nickname …… Sie können den Spitznamen leicht ändern. Es gibt keine Einschränkungen und Sie können frei abrufen und neu schreiben. --realname …… Der echte Name kann nicht so einfach geändert werden. Also kann ich es herausnehmen, aber ich kann es nicht umschreiben. ――Alter …… Alter kann Makrele lesen, also werde ich es dieses Mal umschreiben. Da es sich jedoch um ein Alter handelt, muss es mindestens 0 Jahre alt sein.

Um diese Anforderung zu erfüllen, sollte die Klasse folgendermaßen aussehen:

--nickname: Ich habe beide Getter / Setter. --realname: Nur Getter haben. --age: Ich habe einen Getter und einen Conditional Setter.

Außerdem definieren wir dieses Mal einen Konstruktor, der dieses Feld gleichzeitig mit der Instanziierung festlegen kann.

Java Im Fall von Java wird viel geschrieben, aber es ist einfach zu tun. Felder, die ehrlich definiert werden sollten, werden als private Variablen definiert, und Getter / Setter werden nur als öffentliche Methoden definiert. Wenn Sie ein Limit setzen möchten, schreiben Sie die Logik in die Methode. Wenn Sie überhaupt nicht darauf zugreifen möchten, müssen Sie lediglich eine Methode schreiben. Der Konstruktor nimmt auch die Argumente der Reihe nach und setzt sie in seine eigenen Felder.

public class Main {
    public static void main(String[] args) throws Exception {
        Human konan = new Human("Shinichi Kudo", "Aber Kudo", 17);

        //Sie können Ihren Spitznamen, Ihren richtigen Namen und Ihr Alter frei abrufen.
        System.out.println(konan.getNickname()); // ->Aber Kudo
        System.out.println(konan.getRealname()); // ->Shinichi Kudo
        System.out.println(konan.getAge()); // -> 17
        
        //Spitzname und Alter können umgeschrieben werden
        konan.setNickname("Conan Edogawa");
        konan.setAge(7);
        System.out.println(konan.getNickname()); // ->Conan Edogawa
        System.out.println(konan.getAge()); // -> 7
        
        //Selbst wenn Sie ein seltsames Alter eingeben, wird es ignoriert
        konan.setAge(-10000);
        System.out.println(konan.getAge()); // ->Bleibt 7
        
        //Sie können Ihren richtigen Namen nicht ändern.
        // konan.setRealname("Conan Edogawa"); // ->Ich werde wütend, weil es keine solche Methode gibt.
        
        //Dann Conan, wie heißt du wirklich?
        System.out.println(konan.getRealname()); // ->Shinichi Kudo. Ah ... schließlich.
    }
}

class Human{
    private String realname;
    private String nickname;
    private int age;
    
    public Human(String realname, String nickname, int age){
        this.realname = realname;
        this.nickname = nickname;
        if (age >= 0){
            this.age = age;
        }
    }
    
    public String getRealname(){
        return realname;
    }
    
    public String getNickname(){
        return nickname;
    }
    
    public void setNickname(String nickname){
        this.nickname = nickname;
    }
    
    public int getAge(){
        return age;
    }
    
    public void setAge(int age){
        if (age >= 0){
            this.age = age;
        }
    }
}

In der Human-Klasse gibt es viel Code. Dieses Mal habe ich Bedingungen und Einschränkungen festgelegt, damit ich mich nicht so unangenehm fühle, aber wenn praktisch alle Felder zugänglich sind und All-you-can-eat-Kurse angeboten werden, fühle ich mich unfruchtbar. In einigen Fällen kann die Bibliothek mit dem Namen Lombok etwas sauberer geschrieben werden, und in anderen Fällen wird die Getter / Setter-Methode automatisch mithilfe der IDE-Funktion generiert, die jedoch an eine andere Person übergeben wird.

Daher scheint es, dass moderne Sprachen häufig eine spezielle Art des Schreibens ihrer eigenen Felder (obwohl sie auch als Attribute bezeichnet werden) Getter / Setter implementieren. C # ist einer von ihnen.

C# In C # wird eine Funktion namens properties verwendet, um Felder von außen neu zu schreiben und abzurufen. Es sieht so aus, als würden Sie das Feld direkt umschreiben. Da es sich jedoch tatsächlich um eine Getter / Setter-Methode handelt, wird dies in ** Pascal-Fall ** geschrieben (in C # lautet der Methodenname Pascal-Fall). Wenn Sie Eigenschaften verwenden, haben Sie nicht das Gefühl, jedes Mal eine Methode zu durchlaufen, und Sie haben das Gefühl, dass Sie direkt zuweisen oder referenzieren.

using System;

public class Program
{
    public static void Main()
    {
        Human konan = new Human("Shinichi Kudo","Aber Kudo",17);
        
        //Sie können Ihren Spitznamen, Ihren richtigen Namen und Ihr Alter frei abrufen.
        Console.WriteLine(konan.Nickname); // ->Aber Kudo
        Console.WriteLine(konan.Realname); // ->Shinichi Kudo
        Console.WriteLine(konan.Age); // -> 17
        
        //Der Spitzname und das Alter können umgeschrieben werden.
        konan.Nickname = "Conan Edogawa";
        konan.Age = 7;
        Console.WriteLine(konan.Nickname); // ->Conan Edogawa
        Console.WriteLine(konan.Age); // ->7
        
        //Selbst wenn Sie ein seltsames Alter eingeben, wird es ignoriert
        konan.Age = -10000;
        Console.WriteLine(konan.Age); // ->Bleibt 7

        //Sie können Ihren richtigen Namen nicht ändern
        // konan.Realname = "Conan Edogawa"; //Seine Eigenschaft ist Lesen-Sei wütend auf Only
        
        //Dann Conan, wie heißt du wirklich?
        Console.WriteLine(konan.Realname); // ->Shinichi Kudo. Ah ... schließlich.
    }
}

class Human
{
    public string Realname{ get; }
    public string Nickname{ get; set; }
    private int age;
    public int Age
    {
        get
        {
            return this.age;
        }
        set{
            if (value >= 0)
            { 
                this.age = value;
            }
        }
    }
    
    public Human(string realname, string nickname, int age)
    {
        this.Realname = realname;
        this.Nickname = nickname;
        if (age >= 0)
        {
            this.Age = age;
        }
    }
}

Wenn Sie eine Eigenschaft verwenden möchten, die gelesen oder geschrieben werden kann, schreiben Sie einfach {get; set;} nach dem Eigenschaftsnamen. Wenn Sie die schreibgeschützte Eigenschaft verwenden möchten, verwenden Sie {get;} [^ 1]. Wenn Sie nach einer internen Verarbeitung beim Festlegen oder Abrufen zurückkehren oder festlegen möchten, bereiten Sie ein separates Feld (dies ist eine normale Variable, also Kamelfall) und nach der Eigenschaftsdeklaration vor Schreiben Sie wie folgt.

[^ 1]: ~~ Tatsächlich scheint die schreibgeschützte Eigenschaft in C # nicht unterstützt zu werden. In diesem Fall wird es separat als normale Setter-Methode implementiert. ~~ Wenn Sie private get verwenden, können Sie schreibgeschützte Eigenschaften verwenden (siehe Postscript).

{
    get
    {
        //Etwas zu verarbeiten
return Verarbeitetes Ergebnis;
    }
    set
    {
        //Etwas mit Wert verarbeitet
        this.Feld=Ergebnis der Verarbeitung;
    }
}

Zu diesem Zeitpunkt wird innerhalb des Setzers der empfangene Wert automatisch mit dem Argument "Wert" empfangen.

Da einige Eigenschaften diesmal schreibgeschützt sind, sieht der Konstruktor wie Java aus. Wenn jedoch alle Eigenschaften über Schreibberechtigung verfügen, müssen Sie keinen Konstruktor vorbereiten. Sie können so etwas schreiben: Es ist sehr sauber.

Human konan = new Human(){ Realname = "Shinichi Kudo", Nickname = "Aber Kudo", Age = 17 };

abschließend

Es gibt viele Gespräche über die Vor- und Nachteile von Getter / Setter, aber es gibt immer noch einige Dinge, die nicht vermieden werden können, wenn über objektorientierte Kapselung gesprochen wird. Da ich aus Java stamme, verstehe ich, dass Objekte nur Variablen und Methoden haben. Obwohl es leicht zu verstehen war, hatte ich den Eindruck, dass es überflüssig und mühsam war.

Als ich den C # -Code zum ersten Mal sah, kannte ich nicht einmal die Funktion von Eigenschaften. Warum schreibt dieser Typ also Variablen im Pascal-Fall? Ich dachte, aber als ich es nachschlug, war ich beeindruckt, dass es so präzise geschrieben werden konnte. Wenn jedoch Logik in Getter / Setter enthalten ist, wird sie leicht verzögert und schwer zu erkennen sein, und da sich der Schreibstil um diese herum mit jedem Versions-Upgrade von C # während der Untersuchung weiterentwickelt Ich hatte den Eindruck, dass es ziemlich verwirrend war, weil viele Informationen wie "Ich kann so schreiben" und "Ich habe früher so geschrieben" herauskamen und ich verwirrt war.

Dieser Artikel ist auch eine Zusammenfassung für mich. Wir hoffen, dieser Artikel hat Ihnen geholfen, Ihr C # -Leben zu verbessern.

Nachtrag (29.3.2019)

Standardwert

Da ich im obigen Artikel vergessen habe zu schreiben, können Sie den C # -Eigenschaften Anfangswerte geben. Wenn Sie beispielsweise einem neugeborenen menschlichen Objekt den Namen "anonym" geben möchten, können Sie es wie folgt schreiben, ohne ein Feld vorbereiten zu müssen, um es zu initialisieren oder einen Konstruktor zu definieren.

string name{ get; set; } = "Anonym";

Dies allein ist nett, aber nützlich, wenn Sie beispielsweise ein Objekt einer Klasse als Eigenschaft in der Klasse haben möchten.

class Human{
    public List<string> Tools{ get; set; } = new List<string>();
}

Auf diese Weise können Sie diese Eigenschaft plötzlich von außerhalb der Objekte dieser Klasse bearbeiten.

var konan = new Human();
konan.Tools.Add("Sprachwechsler");
konan.Tools.Add("Kick Power Enhancement Schuhe");
konan.Tools.Add("Anästhesiepistole beobachten"); 

Wenn Sie dies versuchen, ohne die Eigenschaften zu initialisieren, erhalten Sie eine NullReferenceException. Um dies zu vermeiden, müssen Sie außerhalb der Klasse neu sein und dann bleiben.

(Thx: C # er von der gleichen Firma)

Nur-Schreib-Eigenschaft

Im ersten Artikel habe ich geschrieben, dass die schreibgeschützte Eigenschaft nicht verwendet werden kann, aber in Wirklichkeit scheint es, dass sie verwendet werden kann, indem sie zu einer "privaten get" -Eigenschaft gemacht wird. Sie können Ihre Eigenschaften nicht einmal im Inneren lesen.

Deshalb,

public string Secret { set; }

Kann aber nicht geschrieben werden

public string Secret { private get; set; }

Kann geschrieben werden als.

var konan = new Human();
konan.Secret = "In der Tat Shinichi";
// Console.WriteLine(konan.Secret); ←Write-Sei wütend auf Only

(Thx: @muniel)

uint Typ

Dieses Mal habe ich es unter der Annahme geschrieben, dass einige Verarbeitungen am Setter durchgeführt werden, also habe ich den Typ int verwendet, aber es scheint einen Typ namens uint type (Unsigned Int) zu geben, der als vorzeichenlose Ganzzahl bezeichnet wird. Der Typ int verarbeitet -2147483648 bis 2147483647, während der Typ uint 0 bis 4294967295 verarbeitet.

Da der uint-Typ beispielsweise grundsätzlich keine negativen Zahlen verarbeiten kann, wird "10-20" nicht zu "-10", sondern zu "4294967286" (aufgrund der Bitoperation dreht er sich um und stürzt in die größere). Es kann aufgrund unerwarteten Verhaltens eine Brutstätte für Fehler sein. Grundsätzlich scheint es, dass der Typ uint nicht für den Wert verwendet werden sollte, der das Ziel der Arithmetik sein kann.

Wenn Sie jedoch wirklich ein menschliches Objekt erstellen möchten, wird durch Festlegen des Alters für eine festgelegte / abrufbare Eigenschaft das Alter jedes Jahr aktualisiert, sodass Sie wahrscheinlich einen Geburtstag als Eigenschaft im Inneren haben, und das Alter basiert darauf. Es scheint gut, es zu einer Get-Only-Eigenschaft zu machen, die einen Wert berechnet und zurückgibt. (Thx: @ Tonbo0710, @ tak458, @ Zuishin)

Sie können Setter auch im Konstruktor verwenden

public Human(string realname, string nickname, int age)
{
    this.Realname = realname;
    this.Nickname = nickname;
    if (age >= 0)
    {
        this.Age = age;
    }
}

Im obigen Artikel wird die if-Anweisung verwendet, um zu verhindern, dass auch im Konstruktor seltsame Werte eingefügt werden. Wenn Sie jedoch sorgfältig darüber nachdenken, legen Sie den Wert hier über Ihre eigene Eigenschaft und in diesem Setter fest Da es nach beurteilt wird, sollte dies wie folgt geschrieben werden [^ 2]. Darüber hinaus kann "dies" vorhanden sein oder nicht, da die Eigenschaft und der Name der empfangenen Variablen in den Fällen Pascal und Kamel nicht in Konflikt stehen.

public Human(string realname, string nickname, int age)
{
    this.Realname = realname;
    this.Nickname = nickname;
    this.Age = age;
}

(Thx: Yamada)

[^ 2]: Es scheint, dass Sie nur im Konstruktor von außen setzen können, ohne private set zu schreiben.

Recommended Posts

Javaer fasst zusammen, wie C # -Eigenschaften geschrieben werden
[Java FX] So schreiben Sie Eclipse-Berechtigungen in build.gradle
JUnit 5: Wie man Testfälle in enum schreibt
Wie schreibe ich Java String # getBytes in Kotlin?
Hinweise zum Schreiben von Kommentaren auf Englisch
Wie schreibe ich Rails
Wie schreibe ich Docker-Compose
Wie schreibe ich Mockito
So schreiben Sie eine Migrationsdatei
[Ruby on Rails] Wie schreibe ich eine Enumeration auf Japanisch?
So schreiben Sie eine Datumsvergleichssuche in Rails
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
Offline-Echtzeit-Schreibweise Implementierungsbeispiel für das Problem in E05 (Ruby, C11)
Wie man guten Code schreibt
Wie schreibe ich einen Java-Kommentar
[Refactoring] So schreiben Sie Routing
Wie schreibe ich Junit 5 organisiert
Wie schreibe ich Rails Seed
Wie schreibe ich Rails Routing
[Rails 5] japanMap-Link So schreiben Sie Parameter in die js.erb-Datei
[Rails] So schreiben Sie user_id (externer Schlüssel) in einen starken Parameter
Wie man Lombok im Frühling benutzt
So finden Sie May'n in XPath
So blenden Sie die Bildlaufleiste in WebView aus
So führen Sie JUnit in Eclipse aus
Wie man in Ruby auf unbestimmte Zeit iteriert
Java # 6 studieren (Wie man Blöcke schreibt)
Lesen Sie die Java-Eigenschaftendatei in C #
Wie man Ant in Gradle ausführt
Wie man die Programmierung in 3 Monaten beherrscht
Wie man JAVA in 7 Tagen lernt
So erhalten Sie Parameter in Spark
Offline-Echtzeit zum Schreiben eines F03-Ruby- und C-Implementierungsbeispiels
So installieren Sie Bootstrap in Ruby
Wie schreibe ich Ruby, wenn in einer Zeile Zusammenfassung vom Anfänger
Wie schreibe ich, wenn ich mit "C language string array" wie argv [] in Ruby-FFI umgehen möchte?
Verwendung von InjectorHolder in OpenAM
[Rails] Wie schreibe ich eine Ausnahmebehandlung?
So schreiben Sie eine Java-Variablendeklaration
So installieren Sie jQuery in Rails 6
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
So setzen Sie Lombok in Eclipse
So schreiben Sie leicht verständlichen Code [Zusammenfassung 3]
So verketten Sie Zeichenfolgen mit Java
So installieren Sie Swiper in Rails
[swift5] So legen Sie die Farbe hexadezimal fest