{"id":335,"date":"2012-10-11T22:15:12","date_gmt":"2012-10-11T20:15:12","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=335"},"modified":"2025-03-02T11:30:35","modified_gmt":"2025-03-02T10:30:35","slug":"null-values-for-value-types","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2012\/10\/null-values-for-value-types\/","title":{"rendered":"Nullwerte f\u00fcr Wertetypen"},"content":{"rendered":"<p>Im .NET Framework sind Datentypen entweder Wertetypen oder Referenztypen. Wertetypen haben grunds\u00e4tzlich einen Standardkonstruktor, der daf\u00fcr sorgt, dass alle Member-Variablen mit ihrem Standardwert initialisiert werden. Als Standardwert wird dabei auf Speicherebene der Wert 0 verstanden. Es ist generell nicht m\u00f6glich, f\u00fcr Wertetypen einen Standardkonstruktor zu implementieren.<!--more--><\/p>\n<p>Variablen eines Wertetyps nehmen die entsprechenden Werte immer direkt auf, also ohne irgendeine Referenz. Daher kann ein Wertetyp nicht auf Null gesetzt werden. Die normale \u00dcbergabe eines Wertetyps an eine Funktion erfolgt immer durch das Anlegen einer Kopie des zu \u00fcbergebenden Wertes auf dem Stack (Call by Value). Durch die Zuweisung von Wertetypen werden ebenfalls Kopien erzeugt.<\/p>\n<p>Datenbanken unterst\u00fctzten je nach Spaltendefinition neben Werten des jeweiligen Datentyps auch einen Nullwert (siehe DBNull.Value). Der Versuch, eine derartige Spaltendefinition mit einem Wertetyp abzubilden, scheitert an der Restriktion, dass Wertetypen immer einen Wert haben. Aus diesem Grund stellt das .NET Framework die generische Klasse Nullable&lt;T&gt; zur Verf\u00fcgung, die ihrerseits ebenfalls ein Wertetyp ist, jedoch aufgrund entsprechender Umwandlungsoperatoren nicht der Restriktion bez\u00fcglich der Zuweisung von Nullwerten unterliegt.<\/p>\n<pre><code class=\"cs\">Nullable&lt;int&gt; x=null;\r\nNullable&lt;int&gt; y=1;<\/code><\/pre>\n<p>In C# kann die Kurzform wie folgt verwendet werden:<\/p>\n<pre><code class=\"cs\">int? x=null;\r\nint? y=1;<\/code><\/pre>\n<p>Der Datentyp T ist implizit mit T? zuweisungskompatibel. T? ist jedoch nur durch eine explizite Typumwandlung mit T kompatibel. Anstelle der expliziten Typumwandlung kann die Eigenschaft Value verwendet werden. Enth\u00e4lt das Objekt keinen Wert, wird f\u00fcr beide Varianten eine Ausnahme ausgel\u00f6st.<\/p>\n<pre><code class=\"cs\">int i=1;\r\nint? x=i;\r\n\r\nint j=(int)x;\r\nint k=x.Value;<\/code><\/pre>\n<p>F\u00fcr die Pr\u00fcfung, ob ein Objekt einen Wert enth\u00e4lt, dient die Eigenschaft HasValue. Der direkte Vergleich mit Null ist ebenso m\u00f6glich. Jedoch ist dieser Weg nicht so effizient.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im .NET Framework sind Datentypen entweder Wertetypen oder Referenztypen. Wertetypen haben grunds\u00e4tzlich einen Standardkonstruktor, der daf\u00fcr sorgt, dass alle Member-Variablen mit ihrem Standardwert initialisiert werden. Als Standardwert wird dabei auf Speicherebene der Wert 0 verstanden. Es ist generell nicht m\u00f6glich, f\u00fcr Wertetypen einen Standardkonstruktor zu implementieren.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[21,25,19],"class_list":["post-335","post","type-post","status-publish","format-standard","hentry","category-net","tag-net","tag-cs","tag-basics"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/comments?post=335"}],"version-history":[{"count":12,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/335\/revisions"}],"predecessor-version":[{"id":523,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/335\/revisions\/523"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}