Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Warum ist die SHA256 Klasse abstract?
Timmi
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

Warum ist die SHA256 Klasse abstract?

beantworten | zitieren | melden

Hallo zusammen,

ich habe eine Frage zu Klasse SHA256.
Die ist laut den Docs abstrakt. Sie hat aber trotzdem einen Konstruktor. Das verstehe ich schon nicht, denn eine abstrakte Klasse soll ja eigentlich gar keine Instanzen haben.
Davon abgesehen gibt es dann aber noch eine Create() Methode, die eine Instanz erstellt und zurückgibt. Das verstehe ich dann noch weniger.

Warum ist das so?


Danke.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.985
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Die Create Methode liefert eine Instanz der SHA256 Implementierung.
Du arbeitest dann gegen die Abstrakte Klassen SHA256 Instanz.
Der Konstaruktor ist auch als protected markiert, da durch kannst du auch keine direkte Instanz von SHA256 erzeugen.
In der Doku zu SHA256Managed wird auch darauf hingewiesen, über Create von Base Type (SHA256) nutzen um eine Instanz zu erhalten.

Doku:
SHA256 Klasse (System.Security.Cryptography)

T-Virus
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.782
Herkunft: Düsseldorf

beantworten | zitieren | melden

Zitat von Timmi
Die ist laut den Docs abstrakt. Sie hat aber trotzdem einen Konstruktor. Das verstehe ich schon nicht, denn eine abstrakte Klasse soll ja eigentlich gar keine Instanzen haben.
Sie kann doch trotzdem Initialisierungen benötigen?
Die Ableitung muss diesen Konstruktor dann eben aufrufen.
Außerdem: Jede Klasse hat einen Konstruktor, Du siehst ihn nur nicht immer, da er - wenn nicht vorhanden - automatisch ergänzt wird.
Zitat von Timmi
Davon abgesehen gibt es dann aber noch eine Create() Methode, die eine Instanz erstellt und zurückgibt.
Das ist das Factory-Pattern.
Ich vermute, das hat den Hintergrund, dass sie die Implementierungen dahinter ändern können, ohne dass dadurch BreakingChanges entstehen.
Einen konkreten Grund, warum sie das Factory-Pattern verwendet haben, weiß ich aber nicht.
Zitat von T-Virus
Die Create Methode liefert eine Instanz von SHA256Managed.
Das stimmt nur so fast.
Tatsächlich liefert sie eine nested class namens "Implementation", deren Implementierung aber identisch zu SHA256Managed ist.

Was der Grund für dieses ungewöhnliche Vorgehen ist, würde mich aber auch interessieren.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.985
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@Palladin
Hab ich oben bereits angepasst, war in der ersten Version noch drin.
Hab in den Source von .NET 6 und 4.8 geschaut.
In .NET 6 wird tatsächlich die nested Class geliefert.
Dort ist SHA256Managed nur auch als Obsolete markiert.
In .NET 4.8 wird noch etwas interne Magic durchgeführt bzw. über Magic Strings dann eine Instanz von SHA256Managed geliefert.

.NET 6 Implementierung
.NET 4.8 Implementierung

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.828
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,
Zitat
Einen konkreten Grund, warum sie das Factory-Pattern verwendet haben, weiß ich aber nicht. ... Was der Grund für dieses ungewöhnliche Vorgehen ist, würde mich aber auch interessieren.
Hat v.a. mit den verschiedenen Plattformen (Windows, Unix-artige, MacOs) und der Entstehungsgeschichte von .NET (Core) zu tun und da mit diesem Pattern die konkreten Implementierungen web-abstrahiert werden können. Somit war/ist es möglich auf unix-artigen System OpenSSL zu verwenden, während bei Windows deren Crypto-APIs verwendet werden. Weiters ist es somit möglich die Implementierungen zwischen managed und native zu verschieben ohne dass sich für einen Konsumenten dieser Typen etwas ändert.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers