Autor Beitrag
kostonstyle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 94



BeitragVerfasst: Do 17.09.09 08:51 
Hallo miteinander
habe diverse Fragen.
1. Es gibt im Object gewisse Methode, dass man überschreiben sollte, wie zum Beispiel ToString(), GetHashCode() oder Equals(). Habe bei einem Beispiel gesehen, wie die GetHashCode() Methode überschrieben wird.
ausblenden C#-Quelltext
1:
2:
3:
4:
public override int GetHashCode()
      {
         return this.TonesFromStandardPitch.GetHashCode();
      }

Macht der Compiler hier rekursive Aufruf oder wird die GetHashCode() Methode irgendwo anders aufgerufen?

2. Wird hier eine neue Instanz angelegt?
ausblenden C#-Quelltext
1:
Note note5 = (Note)500;					

Die Klasse Note überlädt die Operatoren.

3. Wie kann eine Variable eine Methode aufrufen, zum Beispiel
ausblenden C#-Quelltext
1:
2:
public int TonesFromStandardPitch;
return this.TonesFromStandardPitch.CompareTo(other.TonesFromStandardPitch);



Danke kostonstyle
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 17.09.09 11:51 
Mmh, diese Fragen kommen mir doch sehr primitiv vor (genauer: sie befassen sich mit sehr grundlegenden Dingen der OOP).

user profile iconkostonstyle hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
3:
4:
public override int GetHashCode()
      {
         return this.TonesFromStandardPitch.GetHashCode();
      }

Macht der Compiler hier rekursive Aufruf oder wird die GetHashCode() Methode irgendwo anders aufgerufen?

Es wäre interessant zu wissen, welche Bedeutung das Element TonesFromStandardPitch innerhalb der Klasse hat. Es scheint sich um eine Eigenschaft zu handeln; das ist also innerhalb von this eine Instanz einer anderen Klasse; für diese Klasse gibt es natürlich GetHashCode() - entweder überschrieben oder als ursprüngliche einer anderen Basisklasse oder als diejenige von Object. Also nimmt sich GetHashCode der this-Klasse einfach das Ergebnis von TonesFromStandardPitch.GetHashCode und gibt es als eigenen HashCode aus.

user profile iconkostonstyle hat folgendes geschrieben Zum zitierten Posting springen:
2. Wird hier eine neue Instanz angelegt?
ausblenden C#-Quelltext
1:
Note note5 = (Note)500;					

Die Klasse Note überlädt die Operatoren.

Es handelt sich bei '=' um eine Zuweisung. Also wird die Instanz "500" der Klasse int durch "(Note)" als Instanz der Klasse Note angesehen und der Variablen note5 zugewiesen. Eigentlich ist es nichts anderes als ein weiterer Verweis auf denselben Inhalt des Arbeitsspeichers.

Aber ergänzend solltest du dich mit dem Unterschied zwischen struct und class befassen; der spielt vermutlich auch eine Rolle.

user profile iconkostonstyle hat folgendes geschrieben Zum zitierten Posting springen:
3. Wie kann eine Variable eine Methode aufrufen, zum Beispiel
ausblenden C#-Quelltext
1:
2:
public int TonesFromStandardPitch;
return this.TonesFromStandardPitch.CompareTo(other.TonesFromStandardPitch);

Das ist doch das übliche Vorgehen. Von einer Klasse wird eine Instanz erzeugt und einer Variablen zugewiesen; dann können alle öffentlichen Methoden (und Eigenschaften) dieser Instanz unter Angabe des Variablennamens benutzt werden.
ausblenden C#-Quelltext
1:
2:
int i = 123;
string s = i.ToString();

Jürgen
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 17.09.09 16:34 
Primitiv finde ich die Fragen nicht, denn bei #1 und #3 glaube nicht, dass ich sie überhaupt verstanden habe ;) .


user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconkostonstyle hat folgendes geschrieben Zum zitierten Posting springen:
2. Wird hier eine neue Instanz angelegt?
ausblenden C#-Quelltext
1:
Note note5 = (Note)500;					

Die Klasse Note überlädt die Operatoren.

Es handelt sich bei '=' um eine Zuweisung. Also wird die Instanz "500" der Klasse int durch "(Note)" als Instanz der Klasse Note angesehen und der Variablen note5 zugewiesen. Eigentlich ist es nichts anderes als ein weiterer Verweis auf denselben Inhalt des Arbeitsspeichers.
Das sicherlich nicht. Zwei Variablen können unmöglich die gleiche Referenz enthalten, solange sie nicht beide Referenztypen sind und ein Typ vom anderen abgeleitet ist(/das Interface implementiert hat, um ganz korrekt zu sein).
Wenn Note eine Klasse ist, wird höchstwahrscheinlich schon eine neue Instanz erzeugt, es kommt aber ganz auf den Code im überladenen Cast-Operator an. Wenn dort ein new steht, wird es wohl so sein :zwinker: .

_________________
>λ=
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 17.09.09 19:07 
@Sebastian
Nach deinen Hinweisen erkenne ich, dass ich mit meiner Antwort doch etwas voreilig war. (Was ich mit "primitiv" gemeint hatte, hatte ich schon erläutert.) Ursprünglich wollte ich so etwas schreiben:

Ohne genauere Informationen, wie die jeweilige Klasse und ihre Member definiert sind, kann man nichts genaueres erläutern.

Ich wusste doch, dass ich mit meinem Hinweis auf "Referenzen" nicht korrekt genug war. Vorsorglich hatte ich auf struct und class hingewiesen.

Jürgen