{"id":55000018,"date":"2016-02-01T00:00:00","date_gmt":"2024-04-25T16:19:56","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=18"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Von_VBA_zu_C_Das_StaticSchluesselwort","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Von_VBA_zu_C_Das_StaticSchluesselwort\/","title":{"rendered":"Von VBA zu C#: Das Static-Schl&uuml;sselwort"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/c2bb3050e3e34af28379110f3040cbd8\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Was bedeutet eigentlich das Schl&uuml;sselwort &#8220;static&#8221;, mit dem Sie sowohl Typen\/Klassen also auch die Elemente einer Klasse wie Methoden oder Eigenschaften kennzeichnen k&ouml;nnen &#8211; und was ist bei der Erstellung und  Nutzung von Typen und Elementen mit diesem Schl&uuml;sselwort zu beachten? Dies schauen wir uns im vorliegenden Artikel an und liefern einige Beispiele, welche die Regeln verdeutlichen.<\/b><\/p>\n<h2>Statische Klassen unter VBA<\/h2>\n<p>Unter VBA waren schon einige Verrenkungen n&ouml;tig, wenn Sie auf die Methoden oder Eigenschaften einer Klasse zugreifen wollten, ohne diese Klasse selbst zu instanzieren &#8211; also beispielsweise so:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objTest<span style=\"color:blue;\"> As <\/span>clsTest\r\n<span style=\"color:blue;\">Set<\/span> objTest = <span style=\"color:blue;\">New<\/span> clsTest\r\nobjTest.Beispielmethode<\/pre>\n<p>Mit ein paar Tricks konnten Sie eine Klasse mit einer zus&auml;tzlichen, im VBA-Editor nicht sichtbaren Eigenschaft ausstatten, die es erm&ouml;glichte, direkt auf ihre Methoden zuzugreifen. Das sah dann schlicht so aus:<\/p>\n<pre>clsTest.Beispielmethode<\/pre>\n<p>Der Trick ist, die Klasse per <b>SaveAsText <\/b>zu exportieren und dann den Wert des Attributs <b>VB_PredeclaredId <\/b>in einem Texteditor auf <b>True <\/b>einzustellen:<\/p>\n<pre>Attribute VB_GlobalNameSpace = <span style=\"color:blue;\">False<\/span>\r\nAttribute VB_Creatable = <span style=\"color:blue;\">False<\/span>\r\nAttribute VB_PredeclaredId = <span style=\"color:blue;\">True<\/span>\r\nAttribute VB_Exposed = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">Option Compare Database<\/span>\r\n<span style=\"color:blue;\">Option Explicit<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>Beispielmethode()\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Beispielmethode\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach konnten Sie in VBA einfach den Namen der Klasse gefolgt von einem Punkt angeben, um per IntelliSense die Member der Klasse einzublenden (siehe Bild 1). Sie konnten die Klasse aber weiterhin instanzieren und wie eine herk&ouml;mmliche Klasse per Objektverweis nutzen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_18_001.png\" alt=\"\"Statische\" Klassen unter VBA\" width=\"550\" height=\"271,2443\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: &#8220;Statische&#8221; Klassen unter VBA<\/span><\/b><\/p>\n<p>Zum Gl&uuml;ck waren die beschriebenen Schritte nur notwending, wenn Sie die gew&uuml;nschte Funktion tats&auml;chlich im Kontext einer Klasse ben&ouml;tigten &#8211; also etwa, um Eigenschaften einzugeben und dann eine oder mehrere Methoden aufzurufen. F&uuml;r den direkten Aufruf einer Methode (beziehungsweise Prozedur, wie es unter VBA hei&szlig;t) gibt es ja zum Gl&uuml;ck das gute, alte Standardmodul.<\/p>\n<h2>Statische Klassen unter C#<\/h2>\n<p>Unter C# ist dieses Feature standardm&auml;&szlig;ig vorgesehen, und zwar in verschiedenen Stufen. Dabei hilft Ihnen das Schl&uuml;sselwort <b>static<\/b>, das Sie dem Namen einer Klasse oder auch einer Methode, Variable oder anderen Membern voranstellen k&ouml;nnen &#8211; allerdings nicht in beliebigen Kombinationen.<\/p>\n<p>In einer Klasse, die nicht mit dem Schl&uuml;sselwort <b>static <\/b>versehen ist, k&ouml;nnen Sie etwa eine Methode mit diesem Schl&uuml;sselwort ausstatten. Dies ist immer der Fall, wenn Sie etwa eine Konsolenanwendung erstellen &#8211; hier wird standardm&auml;&szlig;ig eine statische Methode namens <b>Main <\/b>angegeben, welche beim Start ausgel&ouml;st wird:<\/p>\n<pre>class Program {\r\n     static void Main(string[] args) {\r\n        ...\r\n     }\r\n}<\/pre>\n<p>Wollen Sie eine eigene Methode nutzen, ohne die Klasse als Objekt zu instanzieren, m&uuml;ssen Sie diese schlicht mit dem Schl&uuml;sselwort <b>static <\/b>auszeichnen. Dies erledigen Sie in beliebigen Klassen wie folgt:<\/p>\n<pre>class NichtStatisch {\r\n     public static void StatischeMethode() {\r\n         Console.WriteLine(\"Statische Methode in nicht \r\n             statischer Klasse.\");\r\n         Console.ReadLine();\r\n     }\r\n}<\/pre>\n<p>Diese Methode rufen Sie nun etwa von der <b>Main<\/b>-Methode des Projekts wie folgt auf:<\/p>\n<pre>static void Main1(string[] args) {\r\n     NichtStatisch.StatischeMethode();\r\n}<\/pre>\n<p>Beachten Sie, dass Sie hier den Namen der Klasse beziehungsweise des Typs angeben, in dem sich die Methode befindet, und dann nach Eingabe eines Punktes direkt die statische Klasse per IntelliSense ausw&auml;hlen k&ouml;nnen (siehe Bild 2). Wenn Sie eine Methode hingegen nicht als statisch deklarieren, sieht diese wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_18_002.png\" alt=\"Statische Methode einer nicht statischen Klasse unter C#\" width=\"550\" height=\"311,5607\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Statische Methode einer nicht statischen Klasse unter C#<\/span><\/b><\/p>\n<pre>class NichtStatisch {\r\n     public void NichtStatischeMethode() {\r\n         Console.WriteLine(\"Nicht statische Methode in \r\n             nicht statischer Klasse.\");\r\n         Console.ReadLine();\r\n     }\r\n}<\/pre>\n<p>Um diese aufzurufen, m&uuml;ssen Sie die Klasse zun&auml;chst in-stanzieren und in einer Objektvariablen speichern:<\/p>\n<pre>NichtStatisch nichtStatisch = new NichtStatisch();\r\nnichtStatisch.NichtStatischeMethode();<\/pre>\n<p>Eine nicht als statisch deklarierte Klasse mit statisch deklarierten Methoden verh&auml;lt sich aber dennoch nicht so wie die eingangs beschriebene VBA-Klasse &#8211; die statischen Methoden stehen zwar direkt &uuml;ber den Typbezeichner zur Verf&uuml;gung und die nicht statischen Methoden &uuml;ber die Instanz.<\/p>\n<p>Aber die statischen Member k&ouml;nnen ausschlie&szlig;lich &uuml;ber den Typ und nicht &uuml;ber eine Instanzvariable genutzt werden.<\/p>\n<h2>Statische Klassen\/Typen<\/h2>\n<p>Es gibt noch eine weitere Variante, n&auml;mlich die, bei der Sie die komplette Klasse als statisch deklarieren &#8211; etwa so:<\/p>\n<pre>static class Statisch {\r\n     public static void StatischeMethodeStatischeKlasse() {\r\n         Console.WriteLine(\"Statische Methode in \r\n             statischer Klasse.\");\r\n         Console.ReadLine();\r\n     }\r\n}<\/pre>\n<p>Die Member einer solchen Klasse, also die Methoden, Eigenschaften und so weiter, m&uuml;ssen ebenfalls mit dem Schl&uuml;sselwort <b>static <\/b>ausgezeichnet werden.<\/p>\n<p>Sie k&ouml;nnen keine Objektvariable eines statischen Typs erstellen, somit ist also auch kein Zugriff auf die Member &uuml;ber eine Objektvariable m&ouml;glich. Genauso k&ouml;nnen Sie keine nicht statischen Member in einer statischen Klasse unterbringen.<\/p>\n<h2>Folgen f&uuml;r das this-Schl&uuml;sselwort<\/h2>\n<p>Wenn Sie innerhalb einer Klasse auf eine statische Methode oder ein anderes Member zugreifen wollen, m&uuml;ssen Sie direkt auf diese zugreifen, ohne das Schl&uuml;sselwort this zu verwenden:<\/p>\n<pre>public void Aufruf() {\r\n     \/\/Aufruf verschiedener Methoden\r\n     \/\/statische Methode: direkt aufrufbar ...\r\n     StatischeMethode();\r\n     \/\/... oder mit Voranstellen des Typs:\r\n     NichtStatisch.StatischeMethode();\r\n     \/\/Nicht statische Elemente k&ouml;nnen auch &uuml;ber das \r\n     \/\/this-Schl&uuml;sselwort referenziert werden:\r\n     this.NichtStatischeMethode();\r\n}<\/pre>\n<h2>Wozu statische Klassen?<\/h2>\n<p>Statische Klassen sind dort sinnvoll, wo Sie eine Sammlung von Methoden ben&ouml;tigen, die thematisch zusammenh&auml;ngen. Ein gutes Beispiel f&uuml;r eine solche Klasse aus dem .NET-Framework ist die <b>Math<\/b>-Klasse. Sie geben einfach den Namen des Typs gefolgt von einem Punkt ein und erhalten per IntelliSense eine Liste aller verf&uuml;gbaren mathematischen Funktionen.<\/p>\n<p>Wenn Sie eigene Funktionen haben, die Sie in Form von Methoden in einem Projekt bereitstellen wollen, ist eine statische Klasse ein geeigneter Ort &#8211; zumindest, wenn Sie nicht immer gleich eine Klasse instanzieren wollen.<\/p>\n<p>Eine statische Klasse hat nat&uuml;rlich auch Einschr&auml;nkungen: Zum Beispiel k&ouml;nnen Sie, wenn eine der enthaltenen Methoden bereits in Verwendung ist, nun aber die enthaltene Funktion etwas ge&auml;ndert werden soll, diese &Auml;nderung nicht einfach durchf&uuml;hren &#8211; m&ouml;glicherweise w&uuml;rde ein bestehender Aufruf ja nicht mehr das erwartete Ergebnis erhalten.<\/p>\n<p>Hier gibt es wesentlich bessere M&ouml;glichkeiten, wenn Sie die Methode nicht als statische Methode verwenden, sondern als Methode einer Klasse.<\/p>\n<p>Sie k&ouml;nnten diese dann &uuml;berladen oder, wenn Sie andere Parameter &uuml;bergeben wollen, die Parameter auf andere Weise als nur beim Aufruf eingeben.<\/p>\n<p>F&uuml;r eine einfache Funktionssammlung ist eine statische Klasse jedoch in vielen F&auml;llen der richtige Ort. Sie w&uuml;rden eine solche dann so &auml;hnlich nutzen wie ein VBA-Standardmodul, das typischerweise <b>mdlTools<\/b>, <b>mdlGlobal <\/b>oder <b>mdlUtilities <\/b>genannt wurde &#8211; gegebenenfalls noch feiner nach dem Anwendungszweck auf mehrere Klassen aufgeteilt.<\/p>\n<p>Aber: Damit n&auml;hern Sie sich nat&uuml;rlich wieder der prozeduralen Programmierung an und entfernen sich von der objektorientierten Programmierung. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was bedeutet eigentlich das Schl&uuml;sselwort &#8220;static&#8221;, mit dem Sie sowohl Typen\/Klassen also auch die Elemente einer Klasse wie Methoden oder Eigenschaften kennzeichnen k&ouml;nnen &#8211; und was ist bei der Erstellung und  Nutzung von Typen und Elementen mit diesem Schl&uuml;sselwort zu beachten? Dies schauen wir uns im vorliegenden Artikel an und liefern einige Beispiele, welche die Regeln verdeutlichen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012016,662016,44000001],"tags":[],"yst_prominent_words":[],"class_list":["post-55000018","post","type-post","status-publish","format-standard","hentry","category-66012016","category-662016","category-CGrundlagen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000018","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000018"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000018\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000018"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000018"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000018"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000018"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}