Es ist immer eine gute Idee, Daten von Algorithmen zu trennen, um mehr Abstraktion zu schaffen. Dadurch erhält man viele Vorteile, die wir nach ein kurzes, praktisches Beispiel aus dem Alltag sehen werden.
Zuerst schauen wir uns mal, exemplarisch, eine Methode zum Initialisieren einer Datentabelle, namens „settings“ an:
public void InitSettingsValues()
{
_DataSet.Tables["settings"].Rows[0]["column0"] = false;
_DataSet.Tables["settings"].Rows[0]["column1"] = true;
_DataSet.Tables["settings"].Rows[0]["column2"] = null;
_DataSet.Tables["settings"].Rows[0]["column3"] = 47.11;
_DataSet.Tables["settings"].Rows[0]["column4"] = "Hello World!";
_DataSet.Tables["settings"].Rows[0]["column5"] = new DateTime(2001, 9, 11);
_DataSet.Tables["settings"].Rows[0]["column6"] = 6;
_DataSet.Tables["settings"].Rows[0]["column7"] = 7;
_DataSet.Tables["settings"].Rows[0]["column8"] = 8;
_DataSet.Tables["settings"].Rows[0]["column9"] = 9;
_DataSet.Tables["settings"].Rows[0]["column10"] = 10;
//... usw.
_DataSet.Tables["settings"].Rows[0]["column99"] = 99;
_DataSet.Tables["settings"].Rows[0]["column100"] = 100;
}
Dieser Code ist alles andere als optimal:
- Ist weder leicht lesbar, noch überschaubar
- Enthält viele Wiederholungen (DRY: Don’t Repeat Yourself)
- Ist nicht abstrakt, sondern explizit („settings“ und 0 als Zeilennummer)
- Man kann es nicht wiederverwenden (für die Tabelle „nichtSettings“ muss eigene Methode geschrieben werden)
- Man kann es nicht leicht pflegen, erweitern, oder mehrere Varianten davon, nebeneinander erstellen/verwenden/aufrufen (siehe den besseren Code unten):
- Was tun wir, wenn bei nächstem Release, per Konfiguration, entweder die eine oder andere Methode aufgerufen werden soll? (z.B. für spezielle Kunden, oder Rollback der Version aufgrund gravierende Sicherheitsmangel udg.)
- Was tun wir, wenn es N (N >= 2) Daten-Varianten gibt (der eine hat X Spalten mehr/weniger)?
- Man kann nicht wirklich von „Algorithmus“ sprechen
- Der Code für CPU und RAM wird unnötig aufgeblasen, und lässt sich schlecht optimieren (siehe IL und Assembler Listings für Intel x64 zum Vergleichen am Ende des Beitrags)
Und nun trennen wir die Daten von Algorithmus:
// Daten.
private (string ColumnName, object Value)[] _SettingsInitValues = { ("column0", false), ("column1", true), ("column2", null), ("column3", 47.11), ("column4", "Hello World!"), ("column5", new DateTime(2001, 9, 11)), ("column6", 6), ("column7", 7), ("column8", 8), ("column9", 9), ("column10", 10),
//... usw.
("column99", 99), ("column100", 100)
};
// Algorithmus.
public void SetTableValues(DataSet pDataSet, string pTableName, int pRowIndex, IEnumerable<(string ColumnName, object Value)> pColumnNameValueTuples)
{
foreach (var tuple in pColumnNameValueTuples)
{
pDataSet.Tables[pTableName].Rows[pRowIndex][tuple.ColumnName] = tuple.Value;
}
}
Die Methode besteht nun aus die Signatur plus 2 Zeilen, und bietet folgende Qualitätsmerkmale:
- Leichter lesbar: 2 Zeilen
- Überschaubar: 2 Zeilen
- Verständlicher/Selbsterklärend: 2 Zeilen
- Abstrakter: kann auch für andere Tabellen des „_DataSet“ oder sogar andere DataSets verwendet werden
- Leichter zu pflegen
- Leichter zu Debuggen
- Leichter zu erweitern
- Grundsätzlich: leichter zu ändern
- Man kann weitere Daten-Varianten nebeneinander einsetzen
Mit diesem Code, brauchen wir uns keine Sorgen machen, denn:
- Es ist wiederverwendbar (für andere DataSets, Tabellen, Zeilen-Index)
- Falls es für Kunde X oder Version Y andere Daten-Varianten genommen werden müssen: kein Problem
- Falls es gleichzeitig unterschiedliche Daten-Varianten für unterschiedliche SW-Versionen genommen werden müssen: kein Problem!
- Das Gleiche für die Nutzung unterschiedliche Daten-Varianten per Konfiguration: kein Problem!
- Sollte aus welchem Grund auch immer, ein Rollback der SW-Version unternommen werden muss: kein Problem!
- Sollte Microsoft in der nächste .NET Framework, Core, NET 9 usw. irgendwas an DataSet, deren Tabelle, Zeile oder Spalten ändern: kein Problem! Wir müssen nur eine einzige Zeile ändern
Wie man hier sieht, kann man für 10 verschiedene Versionen/Kunden, die Settings-Tabelle per Konfiguration mit 10 unterschiedliche Daten-Werte initialisieren, OHNE unsere 2 Zeilen Code ändern zu müssen:
private (string ColumnName, object Value)[] _Vers_1_0 = ("column0", 0), ("column1", "dw4mrkzy") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_1 = ("column0", 2), ("column1", "LR0_uClc") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_2 = ("column0", 0), ("column1", "SR1Vj5ts") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_3 = ("column0", 2), ("column1", "hiKlLG55") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_4 = ("column0", 8), ("column1", "s2Z4MkKZ") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_5 = ("column0", 0), ("column1", "qXZM0x4h") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_6 = ("column0", 0), ("column1", "UQryY_SV") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_7 = ("column0", 0), ("column1", "CB80QEcy") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_8 = ("column0", 8), ("column1", "S59sdhFc") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_9 = ("column0", 7), ("column1", "FSgCWXii") /*... usw. */};
private (string ColumnName, object Value)[] _Vers_1_10 = ("column0", 3), ("column1", "hdNvQ8Wt") /*... usw. */};
Die Unterschiede in IL:
Zuerst der IL Code von „SetTableValues(…)“ (optimaler Code):
Die letzte Zeilennummer (in Hex) ist 0x0057 = 87 dez.
IL_0000 nop
IL_0001 nop
IL_0002 ldarg.3
IL_0003 callvirt IEnumerable <ValueTuple<String,Object>>.GetEnumerator ()
IL_0008 stloc.0
IL_0009 br.s IL_0042
IL_000B ldloc.0
IL_000C callvirt IEnumerator <ValueTuple<String,Object>>.get_Current ()
IL_0011 stloc.1 // tuple
IL_0012 nop
IL_0013 ldarg.0
IL_0014 ldfld UserQuery._DataSet
IL_0019 callvirt DataSet.get_Tables ()
IL_001E ldarg.1
IL_001F callvirt DataTableCollection.get_Item (String)
IL_0024 callvirt DataTable.get_Rows ()
IL_0029 ldarg.2
IL_002A callvirt DataRowCollection.get_Item (Int32)
IL_002F ldloc.1 // tuple
IL_0030 ldfld ValueTuple <String, Object>.Item1
IL_0035 ldloc.1 // tuple
IL_0036 ldfld ValueTuple <String, Object>.Item2
IL_003B callvirt DataRow.set_Item (String, Object)
IL_0040 nop
IL_0041 nop
IL_0042 ldloc.0
IL_0043 callvirt IEnumerator.MoveNext ()
IL_0048 brtrue.s IL_000B
IL_004A leave.s IL_0057
IL_004C ldloc.0
IL_004D brfalse.s IL_0056
IL_004F ldloc.0
IL_0050 callvirt IDisposable.Dispose ()
IL_0055 nop
IL_0056 endfinally
IL_0057 ret
Der IL Code von „InitSettingsValues()“ (nicht optimaler Code):
Die letzte Zeilennummer (in Hex) lautet: 0x0291 = 657 dez.
IL_0000 nop
IL_0001 ldarg.0
IL_0002 ldfld UserQuery._DataSet
IL_0007 callvirt DataSet.get_Tables ()
IL_000C ldstr "settings"
IL_0011 callvirt DataTableCollection.get_Item (String)
IL_0016 callvirt DataTable.get_Rows ()
IL_001B ldc.i4.0
IL_001C callvirt DataRowCollection.get_Item (Int32)
IL_0021 ldstr "column0"
IL_0026 ldc.i4.0
IL_0027 box Boolean
IL_002C callvirt DataRow.set_Item (String, Object)
IL_0031 nop
IL_0032 ldarg.0
IL_0033 ldfld UserQuery._DataSet
IL_0038 callvirt DataSet.get_Tables ()
IL_003D ldstr "settings"
IL_0042 callvirt DataTableCollection.get_Item (String)
IL_0047 callvirt DataTable.get_Rows ()
IL_004C ldc.i4.0
IL_004D callvirt DataRowCollection.get_Item (Int32)
IL_0052 ldstr "column1"
IL_0057 ldc.i4.1
IL_0058 box Boolean
IL_005D callvirt DataRow.set_Item (String, Object)
IL_0062 nop
IL_0063 ldarg.0
IL_0064 ldfld UserQuery._DataSet
IL_0069 callvirt DataSet.get_Tables ()
IL_006E ldstr "settings"
IL_0073 callvirt DataTableCollection.get_Item (String)
IL_0078 callvirt DataTable.get_Rows ()
IL_007D ldc.i4.0
IL_007E callvirt DataRowCollection.get_Item (Int32)
IL_0083 ldstr "column2"
IL_0088 ldnull
IL_0089 callvirt DataRow.set_Item (String, Object)
IL_008E nop
IL_008F ldarg.0
IL_0090 ldfld UserQuery._DataSet
IL_0095 callvirt DataSet.get_Tables ()
IL_009A ldstr "settings"
IL_009F callvirt DataTableCollection.get_Item (String)
IL_00A4 callvirt DataTable.get_Rows ()
IL_00A9 ldc.i4.0
IL_00AA callvirt DataRowCollection.get_Item (Int32)
IL_00AF ldstr "column3"
IL_00B4 ldc.r8 AE 47 E1 7A 14 8E 47 40 // 47,11
IL_00BD box Double
IL_00C2 callvirt DataRow.set_Item (String, Object)
IL_00C7 nop
IL_00C8 ldarg.0
IL_00C9 ldfld UserQuery._DataSet
IL_00CE callvirt DataSet.get_Tables ()
IL_00D3 ldstr "settings"
IL_00D8 callvirt DataTableCollection.get_Item (String)
IL_00DD callvirt DataTable.get_Rows ()
IL_00E2 ldc.i4.0
IL_00E3 callvirt DataRowCollection.get_Item (Int32)
IL_00E8 ldstr "column4"
IL_00ED ldstr "Hello World!"
IL_00F2 callvirt DataRow.set_Item (String, Object)
IL_00F7 nop
IL_00F8 ldarg.0
IL_00F9 ldfld UserQuery._DataSet
IL_00FE callvirt DataSet.get_Tables ()
IL_0103 ldstr "settings"
IL_0108 callvirt DataTableCollection.get_Item (String)
IL_010D callvirt DataTable.get_Rows ()
IL_0112 ldc.i4.0
IL_0113 callvirt DataRowCollection.get_Item (Int32)
IL_0118 ldstr "column5"
IL_011D ldc.i4 D1 07 00 00 // 2001
IL_0122 ldc.i4.s 09 // 9
IL_0124 ldc.i4.s 0B // 11
IL_0126 newobj DateTime..ctor
IL_012B box DateTime
IL_0130 callvirt DataRow.set_Item (String, Object)
IL_0135 nop
IL_0136 ldarg.0
IL_0137 ldfld UserQuery._DataSet
IL_013C callvirt DataSet.get_Tables ()
IL_0141 ldstr "settings"
IL_0146 callvirt DataTableCollection.get_Item (String)
IL_014B callvirt DataTable.get_Rows ()
IL_0150 ldc.i4.0
IL_0151 callvirt DataRowCollection.get_Item (Int32)
IL_0156 ldstr "column6"
IL_015B ldc.i4.6
IL_015C box Int32
IL_0161 callvirt DataRow.set_Item (String, Object)
IL_0166 nop
IL_0167 ldarg.0
IL_0168 ldfld UserQuery._DataSet
IL_016D callvirt DataSet.get_Tables ()
IL_0172 ldstr "settings"
IL_0177 callvirt DataTableCollection.get_Item (String)
IL_017C callvirt DataTable.get_Rows ()
IL_0181 ldc.i4.0
IL_0182 callvirt DataRowCollection.get_Item (Int32)
IL_0187 ldstr "column7"
IL_018C ldc.i4.7
IL_018D box Int32
IL_0192 callvirt DataRow.set_Item (String, Object)
IL_0197 nop
IL_0198 ldarg.0
IL_0199 ldfld UserQuery._DataSet
IL_019E callvirt DataSet.get_Tables ()
IL_01A3 ldstr "settings"
IL_01A8 callvirt DataTableCollection.get_Item (String)
IL_01AD callvirt DataTable.get_Rows ()
IL_01B2 ldc.i4.0
IL_01B3 callvirt DataRowCollection.get_Item (Int32)
IL_01B8 ldstr "column8"
IL_01BD ldc.i4.8
IL_01BE box Int32
IL_01C3 callvirt DataRow.set_Item (String, Object)
IL_01C8 nop
IL_01C9 ldarg.0
IL_01CA ldfld UserQuery._DataSet
IL_01CF callvirt DataSet.get_Tables ()
IL_01D4 ldstr "settings"
IL_01D9 callvirt DataTableCollection.get_Item (String)
IL_01DE callvirt DataTable.get_Rows ()
IL_01E3 ldc.i4.0
IL_01E4 callvirt DataRowCollection.get_Item (Int32)
IL_01E9 ldstr "column9"
IL_01EE ldc.i4.s 09 // 9
IL_01F0 box Int32
IL_01F5 callvirt DataRow.set_Item (String, Object)
IL_01FA nop
IL_01FB ldarg.0
IL_01FC ldfld UserQuery._DataSet
IL_0201 callvirt DataSet.get_Tables ()
IL_0206 ldstr "settings"
IL_020B callvirt DataTableCollection.get_Item (String)
IL_0210 callvirt DataTable.get_Rows ()
IL_0215 ldc.i4.0
IL_0216 callvirt DataRowCollection.get_Item (Int32)
IL_021B ldstr "column10"
IL_0220 ldc.i4.s 0A // 10
IL_0222 box Int32
IL_0227 callvirt DataRow.set_Item (String, Object)
IL_022C nop
IL_022D ldarg.0
IL_022E ldfld UserQuery._DataSet
IL_0233 callvirt DataSet.get_Tables ()
IL_0238 ldstr "settings"
IL_023D callvirt DataTableCollection.get_Item (String)
IL_0242 callvirt DataTable.get_Rows ()
IL_0247 ldc.i4.0
IL_0248 callvirt DataRowCollection.get_Item (Int32)
IL_024D ldstr "column99"
IL_0252 ldc.i4.s 63 // 99
IL_0254 box Int32
IL_0259 callvirt DataRow.set_Item (String, Object)
IL_025E nop
IL_025F ldarg.0
IL_0260 ldfld UserQuery._DataSet
IL_0265 callvirt DataSet.get_Tables ()
IL_026A ldstr "settings"
IL_026F callvirt DataTableCollection.get_Item (String)
IL_0274 callvirt DataTable.get_Rows ()
IL_0279 ldc.i4.0
IL_027A callvirt DataRowCollection.get_Item (Int32)
IL_027F ldstr "column100"
IL_0284 ldc.i4.s 64 // 100
IL_0286 box Int32
IL_028B callvirt DataRow.set_Item (String, Object)
IL_0290 nop
IL_0291 ret
Die Intel x64 Assembler Unterschiede:
Zuerst der Assembler Code von „SetTableValues(…)“ (optimaler Code):
Die letzte Zeilennummer (in Hex) ist 0x017d = 575 dez.
L0000 push rbp
L0001 sub rsp, 0x80
L0008 lea rbp, [rsp+0x80]
L0010 xor eax, eax
L0012 mov [rbp-0x58], rax
L0016 xorps xmm4, xmm4
L0019 movaps [rbp-0x50], xmm4
L001d movaps [rbp-0x40], xmm4
L0021 movaps [rbp-0x30], xmm4
L0025 movaps [rbp-0x20], xmm4
L0029 movaps [rbp-0x10], xmm4
L002d mov [rbp-0x60], rsp
L0031 mov [rbp+0x10], rcx
L0035 mov [rbp+0x18], rdx
L0039 mov [rbp+0x20], r8d
L003d mov [rbp+0x28], r9
L0041 mov rax, 0x7ffd31adc320
L004b cmp dword ptr [rax], 0
L004e je short L0055
L0050 call 0x00007ffd906485f0
L0055 nop
L0056 nop
L0057 mov rcx, [rbp+0x28]
L005b mov r11, 0x7ffd31ad7020
L0065 mov rax, 0x7ffd31ad7020
L006f call qword ptr [rax]
L0071 mov [rbp-0x20], rax
L0075 mov rcx, [rbp-0x20]
L0079 mov [rbp-8], rcx
L007d nop
L007e jmp L0106
L0083 lea rdx, [rbp-0x38]
L0087 mov rcx, [rbp-8]
L008b mov r11, 0x7ffd31ad7030
L0095 mov rax, 0x7ffd31ad7030
L009f call qword ptr [rax]
L00a1 movups xmm0, [rbp-0x38]
L00a5 movups [rbp-0x18], xmm0
L00a9 nop
L00aa mov rcx, [rbp+0x10]
L00ae mov rcx, [rcx+0x10]
L00b2 cmp [rcx], ecx
L00b4 call System.Data.DataSet.get_Tables()
L00b9 mov [rbp-0x40], rax
L00bd mov rcx, [rbp-0x40]
L00c1 mov rdx, [rbp+0x18]
L00c5 cmp [rcx], ecx
L00c7 call System.Data.DataTableCollection.get_Item(System.String)
L00cc mov [rbp-0x48], rax
L00d0 mov rcx, [rbp-0x48]
L00d4 cmp [rcx], ecx
L00d6 call System.Data.DataTable.get_Rows()
L00db mov [rbp-0x50], rax
L00df mov rcx, [rbp-0x50]
L00e3 mov edx, [rbp+0x20]
L00e6 cmp [rcx], ecx
L00e8 call System.Data.DataRowCollection.get_Item(Int32)
L00ed mov [rbp-0x58], rax
L00f1 mov rcx, [rbp-0x58]
L00f5 mov rdx, [rbp-0x18]
L00f9 mov r8, [rbp-0x10]
L00fd cmp [rcx], ecx
L00ff call System.Data.DataRow.set_Item(System.String, System.Object)
L0104 nop
L0105 nop
L0106 mov rcx, [rbp-8]
L010a mov r11, 0x7ffd31ad7028
L0114 mov rax, 0x7ffd31ad7028
L011e call qword ptr [rax]
L0120 mov [rbp-0x24], eax
L0123 cmp dword ptr [rbp-0x24], 0
L0127 jne L0083
L012d nop
L012e jmp short L0130
L0130 mov rcx, rsp
L0133 call L0140
L0138 nop
L0139 nop
L013a lea rsp, [rbp]
L013e pop rbp
L013f ret
L0140 push rbp
L0141 sub rsp, 0x30
L0145 mov rbp, [rcx+0x20]
L0149 mov [rsp+0x20], rbp
L014e lea rbp, [rbp+0x80]
L0155 cmp qword ptr [rbp-8], 0
L015a je short L0177
L015c mov rcx, [rbp-8]
L0160 mov r11, 0x7ffd31ad7038
L016a mov rax, 0x7ffd31ad7038
L0174 call qword ptr [rax]
L0176 nop
L0177 nop
L0178 add rsp, 0x30
L017c pop rbp
L017d ret
Der Assembler Code von „InitSettingsValues()“ (nicht optimaler Code):
Die letzte Zeilennummer (in Hex) lautet: 0x0843 = 2115 dez.
L0000 push rbp
L0001 sub rsp, 0x1e0
L0008 lea rbp, [rsp+0x1e0]
L0010 xorps xmm4, xmm4
L0013 movaps [rbp-0x1c0], xmm4
L001a mov rax, 0xfffffffffffffe50
L0024 movaps [rax+rbp], xmm4
L0028 movaps [rbp+rax+0x10], xmm4
L002d movaps [rbp+rax+0x20], xmm4
L0032 add rax, 0x30
L0036 jne short L0024
L0038 mov [rbp+0x10], rcx
L003c mov rax, 0x7ffd3193c320
L0046 cmp dword ptr [rax], 0
L0049 je short L0050
L004b call 0x00007ffd906485f0
L0050 nop
L0051 mov rcx, [rbp+0x10]
L0055 mov rcx, [rcx+0x10]
L0059 cmp [rcx], ecx
L005b call System.Data.DataSet.get_Tables()
L0060 mov [rbp-8], rax
L0064 mov rdx, 0x1b5d3cd23a8
L006e mov rdx, [rdx]
L0071 mov rcx, [rbp-8]
L0075 cmp [rcx], ecx
L0077 call System.Data.DataTableCollection.get_Item(System.String)
L007c mov [rbp-0x10], rax
L0080 mov rcx, [rbp-0x10]
L0084 cmp [rcx], ecx
L0086 call System.Data.DataTable.get_Rows()
L008b mov [rbp-0x18], rax
L008f mov rcx, [rbp-0x18]
L0093 xor edx, edx
L0095 cmp [rcx], ecx
L0097 call System.Data.DataRowCollection.get_Item(Int32)
L009c mov [rbp-0x20], rax
L00a0 mov rcx, 0x7ffd30967238
L00aa call 0x00007ffd9050af00
L00af mov [rbp-0x28], rax
L00b3 mov r8, [rbp-0x28]
L00b7 mov byte ptr [r8+8], 0
L00bc mov r8, [rbp-0x28]
L00c0 mov rdx, 0x1b5d3ceb6b8
L00ca mov rdx, [rdx]
L00cd mov rcx, [rbp-0x20]
L00d1 cmp [rcx], ecx
L00d3 call System.Data.DataRow.set_Item(System.String, System.Object)
L00d8 nop
L00d9 mov rcx, [rbp+0x10]
L00dd mov rcx, [rcx+0x10]
L00e1 cmp [rcx], ecx
L00e3 call System.Data.DataSet.get_Tables()
L00e8 mov [rbp-0x30], rax
L00ec mov rdx, 0x1b5d3cd23a8
L00f6 mov rdx, [rdx]
L00f9 mov rcx, [rbp-0x30]
L00fd cmp [rcx], ecx
L00ff call System.Data.DataTableCollection.get_Item(System.String)
L0104 mov [rbp-0x38], rax
L0108 mov rcx, [rbp-0x38]
L010c cmp [rcx], ecx
L010e call System.Data.DataTable.get_Rows()
L0113 mov [rbp-0x40], rax
L0117 mov rcx, [rbp-0x40]
L011b xor edx, edx
L011d cmp [rcx], ecx
L011f call System.Data.DataRowCollection.get_Item(Int32)
L0124 mov [rbp-0x48], rax
L0128 mov rcx, 0x7ffd30967238
L0132 call 0x00007ffd9050af00
L0137 mov [rbp-0x28], rax
L013b mov r8, [rbp-0x28]
L013f mov byte ptr [r8+8], 1
L0144 mov r8, [rbp-0x28]
L0148 mov rdx, 0x1b5d3ceb6c0
L0152 mov rdx, [rdx]
L0155 mov rcx, [rbp-0x48]
L0159 cmp [rcx], ecx
L015b call System.Data.DataRow.set_Item(System.String, System.Object)
L0160 nop
L0161 mov rcx, [rbp+0x10]
L0165 mov rcx, [rcx+0x10]
L0169 cmp [rcx], ecx
L016b call System.Data.DataSet.get_Tables()
L0170 mov [rbp-0x50], rax
L0174 mov rdx, 0x1b5d3cd23a8
L017e mov rdx, [rdx]
L0181 mov rcx, [rbp-0x50]
L0185 cmp [rcx], ecx
L0187 call System.Data.DataTableCollection.get_Item(System.String)
L018c mov [rbp-0x58], rax
L0190 mov rcx, [rbp-0x58]
L0194 cmp [rcx], ecx
L0196 call System.Data.DataTable.get_Rows()
L019b mov [rbp-0x60], rax
L019f mov rcx, [rbp-0x60]
L01a3 xor edx, edx
L01a5 cmp [rcx], ecx
L01a7 call System.Data.DataRowCollection.get_Item(Int32)
L01ac mov [rbp-0x68], rax
L01b0 mov rdx, 0x1b5d3ceb6c8
L01ba mov rdx, [rdx]
L01bd mov rcx, [rbp-0x68]
L01c1 xor r8d, r8d
L01c4 cmp [rcx], ecx
L01c6 call System.Data.DataRow.set_Item(System.String, System.Object)
L01cb nop
L01cc mov rcx, [rbp+0x10]
L01d0 mov rcx, [rcx+0x10]
L01d4 cmp [rcx], ecx
L01d6 call System.Data.DataSet.get_Tables()
L01db mov [rbp-0x70], rax
L01df mov rdx, 0x1b5d3cd23a8
L01e9 mov rdx, [rdx]
L01ec mov rcx, [rbp-0x70]
L01f0 cmp [rcx], ecx
L01f2 call System.Data.DataTableCollection.get_Item(System.String)
L01f7 mov [rbp-0x78], rax
L01fb mov rcx, [rbp-0x78]
L01ff cmp [rcx], ecx
L0201 call System.Data.DataTable.get_Rows()
L0206 mov [rbp-0x80], rax
L020a mov rcx, [rbp-0x80]
L020e xor edx, edx
L0210 cmp [rcx], ecx
L0212 call System.Data.DataRowCollection.get_Item(Int32)
L0217 mov [rbp-0x88], rax
L021e mov rcx, 0x7ffd3096e688
L0228 call 0x00007ffd9050af00
L022d mov [rbp-0x28], rax
L0231 mov r8, [rbp-0x28]
L0235 movsd xmm0, [UserQuery.InitSettingsValues()]
L023d movsd [r8+8], xmm0
L0243 mov r8, [rbp-0x28]
L0247 mov rdx, 0x1b5d3ceb6d0
L0251 mov rdx, [rdx]
L0254 mov rcx, [rbp-0x88]
L025b cmp [rcx], ecx
L025d call System.Data.DataRow.set_Item(System.String, System.Object)
L0262 nop
L0263 mov rcx, [rbp+0x10]
L0267 mov rcx, [rcx+0x10]
L026b cmp [rcx], ecx
L026d call System.Data.DataSet.get_Tables()
L0272 mov [rbp-0x90], rax
L0279 mov rdx, 0x1b5d3cd23a8
L0283 mov rdx, [rdx]
L0286 mov rcx, [rbp-0x90]
L028d cmp [rcx], ecx
L028f call System.Data.DataTableCollection.get_Item(System.String)
L0294 mov [rbp-0x98], rax
L029b mov rcx, [rbp-0x98]
L02a2 cmp [rcx], ecx
L02a4 call System.Data.DataTable.get_Rows()
L02a9 mov [rbp-0xa0], rax
L02b0 mov rcx, [rbp-0xa0]
L02b7 xor edx, edx
L02b9 cmp [rcx], ecx
L02bb call System.Data.DataRowCollection.get_Item(Int32)
L02c0 mov [rbp-0xa8], rax
L02c7 mov r8, 0x1b5d3ceb6e0
L02d1 mov r8, [r8]
L02d4 mov rdx, 0x1b5d3ceb6d8
L02de mov rdx, [rdx]
L02e1 mov rcx, [rbp-0xa8]
L02e8 cmp [rcx], ecx
L02ea call System.Data.DataRow.set_Item(System.String, System.Object)
L02ef nop
L02f0 mov rcx, [rbp+0x10]
L02f4 mov rcx, [rcx+0x10]
L02f8 cmp [rcx], ecx
L02fa call System.Data.DataSet.get_Tables()
L02ff mov [rbp-0xb0], rax
L0306 mov rdx, 0x1b5d3cd23a8
L0310 mov rdx, [rdx]
L0313 mov rcx, [rbp-0xb0]
L031a cmp [rcx], ecx
L031c call System.Data.DataTableCollection.get_Item(System.String)
L0321 mov [rbp-0xb8], rax
L0328 mov rcx, [rbp-0xb8]
L032f cmp [rcx], ecx
L0331 call System.Data.DataTable.get_Rows()
L0336 mov [rbp-0xc0], rax
L033d mov rcx, [rbp-0xc0]
L0344 xor edx, edx
L0346 cmp [rcx], ecx
L0348 call System.Data.DataRowCollection.get_Item(Int32)
L034d mov [rbp-0xc8], rax
L0354 xor ecx, ecx
L0356 mov [rbp-0xd0], rcx
L035d lea rcx, [rbp-0xd0]
L0364 mov edx, 0x7d1
L0369 mov r8d, 9
L036f mov r9d, 0xb
L0375 call System.DateTime..ctor(Int32, Int32, Int32)
L037a mov rdx, 0x1b5d3ceb6e8
L0384 mov rdx, [rdx]
L0387 mov [rbp-0x1c0], rdx
L038e lea rdx, [rbp-0xd0]
L0395 mov rcx, 0x7ffd30bef900
L039f call 0x00007ffd9050af40
L03a4 mov [rbp-0x1b8], rax
L03ab mov r8, [rbp-0x1b8]
L03b2 mov rdx, [rbp-0x1c0]
L03b9 mov rcx, [rbp-0xc8]
L03c0 cmp [rcx], ecx
L03c2 call System.Data.DataRow.set_Item(System.String, System.Object)
L03c7 nop
L03c8 mov rcx, [rbp+0x10]
L03cc mov rcx, [rcx+0x10]
L03d0 cmp [rcx], ecx
L03d2 call System.Data.DataSet.get_Tables()
L03d7 mov [rbp-0xd8], rax
L03de mov rdx, 0x1b5d3cd23a8
L03e8 mov rdx, [rdx]
L03eb mov rcx, [rbp-0xd8]
L03f2 cmp [rcx], ecx
L03f4 call System.Data.DataTableCollection.get_Item(System.String)
L03f9 mov [rbp-0xe0], rax
L0400 mov rcx, [rbp-0xe0]
L0407 cmp [rcx], ecx
L0409 call System.Data.DataTable.get_Rows()
L040e mov [rbp-0xe8], rax
L0415 mov rcx, [rbp-0xe8]
L041c xor edx, edx
L041e cmp [rcx], ecx
L0420 call System.Data.DataRowCollection.get_Item(Int32)
L0425 mov [rbp-0xf0], rax
L042c mov rcx, 0x7ffd3096b258
L0436 call 0x00007ffd9050af00
L043b mov [rbp-0x28], rax
L043f mov r8, [rbp-0x28]
L0443 mov dword ptr [r8+8], 6
L044b mov r8, [rbp-0x28]
L044f mov rdx, 0x1b5d3ceb6f0
L0459 mov rdx, [rdx]
L045c mov rcx, [rbp-0xf0]
L0463 cmp [rcx], ecx
L0465 call System.Data.DataRow.set_Item(System.String, System.Object)
L046a nop
L046b mov rcx, [rbp+0x10]
L046f mov rcx, [rcx+0x10]
L0473 cmp [rcx], ecx
L0475 call System.Data.DataSet.get_Tables()
L047a mov [rbp-0xf8], rax
L0481 mov rdx, 0x1b5d3cd23a8
L048b mov rdx, [rdx]
L048e mov rcx, [rbp-0xf8]
L0495 cmp [rcx], ecx
L0497 call System.Data.DataTableCollection.get_Item(System.String)
L049c mov [rbp-0x100], rax
L04a3 mov rcx, [rbp-0x100]
L04aa cmp [rcx], ecx
L04ac call System.Data.DataTable.get_Rows()
L04b1 mov [rbp-0x108], rax
L04b8 mov rcx, [rbp-0x108]
L04bf xor edx, edx
L04c1 cmp [rcx], ecx
L04c3 call System.Data.DataRowCollection.get_Item(Int32)
L04c8 mov [rbp-0x110], rax
L04cf mov rcx, 0x7ffd3096b258
L04d9 call 0x00007ffd9050af00
L04de mov [rbp-0x28], rax
L04e2 mov r8, [rbp-0x28]
L04e6 mov dword ptr [r8+8], 7
L04ee mov r8, [rbp-0x28]
L04f2 mov rdx, 0x1b5d3ceb6f8
L04fc mov rdx, [rdx]
L04ff mov rcx, [rbp-0x110]
L0506 cmp [rcx], ecx
L0508 call System.Data.DataRow.set_Item(System.String, System.Object)
L050d nop
L050e mov rcx, [rbp+0x10]
L0512 mov rcx, [rcx+0x10]
L0516 cmp [rcx], ecx
L0518 call System.Data.DataSet.get_Tables()
L051d mov [rbp-0x118], rax
L0524 mov rdx, 0x1b5d3cd23a8
L052e mov rdx, [rdx]
L0531 mov rcx, [rbp-0x118]
L0538 cmp [rcx], ecx
L053a call System.Data.DataTableCollection.get_Item(System.String)
L053f mov [rbp-0x120], rax
L0546 mov rcx, [rbp-0x120]
L054d cmp [rcx], ecx
L054f call System.Data.DataTable.get_Rows()
L0554 mov [rbp-0x128], rax
L055b mov rcx, [rbp-0x128]
L0562 xor edx, edx
L0564 cmp [rcx], ecx
L0566 call System.Data.DataRowCollection.get_Item(Int32)
L056b mov [rbp-0x130], rax
L0572 mov rcx, 0x7ffd3096b258
L057c call 0x00007ffd9050af00
L0581 mov [rbp-0x28], rax
L0585 mov r8, [rbp-0x28]
L0589 mov dword ptr [r8+8], 8
L0591 mov r8, [rbp-0x28]
L0595 mov rdx, 0x1b5d3ceb700
L059f mov rdx, [rdx]
L05a2 mov rcx, [rbp-0x130]
L05a9 cmp [rcx], ecx
L05ab call System.Data.DataRow.set_Item(System.String, System.Object)
L05b0 nop
L05b1 mov rcx, [rbp+0x10]
L05b5 mov rcx, [rcx+0x10]
L05b9 cmp [rcx], ecx
L05bb call System.Data.DataSet.get_Tables()
L05c0 mov [rbp-0x138], rax
L05c7 mov rdx, 0x1b5d3cd23a8
L05d1 mov rdx, [rdx]
L05d4 mov rcx, [rbp-0x138]
L05db cmp [rcx], ecx
L05dd call System.Data.DataTableCollection.get_Item(System.String)
L05e2 mov [rbp-0x140], rax
L05e9 mov rcx, [rbp-0x140]
L05f0 cmp [rcx], ecx
L05f2 call System.Data.DataTable.get_Rows()
L05f7 mov [rbp-0x148], rax
L05fe mov rcx, [rbp-0x148]
L0605 xor edx, edx
L0607 cmp [rcx], ecx
L0609 call System.Data.DataRowCollection.get_Item(Int32)
L060e mov [rbp-0x150], rax
L0615 mov rcx, 0x7ffd3096b258
L061f call 0x00007ffd9050af00
L0624 mov [rbp-0x28], rax
L0628 mov r8, [rbp-0x28]
L062c mov dword ptr [r8+8], 9
L0634 mov r8, [rbp-0x28]
L0638 mov rdx, 0x1b5d3ceb708
L0642 mov rdx, [rdx]
L0645 mov rcx, [rbp-0x150]
L064c cmp [rcx], ecx
L064e call System.Data.DataRow.set_Item(System.String, System.Object)
L0653 nop
L0654 mov rcx, [rbp+0x10]
L0658 mov rcx, [rcx+0x10]
L065c cmp [rcx], ecx
L065e call System.Data.DataSet.get_Tables()
L0663 mov [rbp-0x158], rax
L066a mov rdx, 0x1b5d3cd23a8
L0674 mov rdx, [rdx]
L0677 mov rcx, [rbp-0x158]
L067e cmp [rcx], ecx
L0680 call System.Data.DataTableCollection.get_Item(System.String)
L0685 mov [rbp-0x160], rax
L068c mov rcx, [rbp-0x160]
L0693 cmp [rcx], ecx
L0695 call System.Data.DataTable.get_Rows()
L069a mov [rbp-0x168], rax
L06a1 mov rcx, [rbp-0x168]
L06a8 xor edx, edx
L06aa cmp [rcx], ecx
L06ac call System.Data.DataRowCollection.get_Item(Int32)
L06b1 mov [rbp-0x170], rax
L06b8 mov rcx, 0x7ffd3096b258
L06c2 call 0x00007ffd9050af00
L06c7 mov [rbp-0x28], rax
L06cb mov r8, [rbp-0x28]
L06cf mov dword ptr [r8+8], 0xa
L06d7 mov r8, [rbp-0x28]
L06db mov rdx, 0x1b5d3ceb710
L06e5 mov rdx, [rdx]
L06e8 mov rcx, [rbp-0x170]
L06ef cmp [rcx], ecx
L06f1 call System.Data.DataRow.set_Item(System.String, System.Object)
L06f6 nop
L06f7 mov rcx, [rbp+0x10]
L06fb mov rcx, [rcx+0x10]
L06ff cmp [rcx], ecx
L0701 call System.Data.DataSet.get_Tables()
L0706 mov [rbp-0x178], rax
L070d mov rdx, 0x1b5d3cd23a8
L0717 mov rdx, [rdx]
L071a mov rcx, [rbp-0x178]
L0721 cmp [rcx], ecx
L0723 call System.Data.DataTableCollection.get_Item(System.String)
L0728 mov [rbp-0x180], rax
L072f mov rcx, [rbp-0x180]
L0736 cmp [rcx], ecx
L0738 call System.Data.DataTable.get_Rows()
L073d mov [rbp-0x188], rax
L0744 mov rcx, [rbp-0x188]
L074b xor edx, edx
L074d cmp [rcx], ecx
L074f call System.Data.DataRowCollection.get_Item(Int32)
L0754 mov [rbp-0x190], rax
L075b mov rcx, 0x7ffd3096b258
L0765 call 0x00007ffd9050af00
L076a mov [rbp-0x28], rax
L076e mov r8, [rbp-0x28]
L0772 mov dword ptr [r8+8], 0x63
L077a mov r8, [rbp-0x28]
L077e mov rdx, 0x1b5d3ceb718
L0788 mov rdx, [rdx]
L078b mov rcx, [rbp-0x190]
L0792 cmp [rcx], ecx
L0794 call System.Data.DataRow.set_Item(System.String, System.Object)
L0799 nop
L079a mov rcx, [rbp+0x10]
L079e mov rcx, [rcx+0x10]
L07a2 cmp [rcx], ecx
L07a4 call System.Data.DataSet.get_Tables()
L07a9 mov [rbp-0x198], rax
L07b0 mov rdx, 0x1b5d3cd23a8
L07ba mov rdx, [rdx]
L07bd mov rcx, [rbp-0x198]
L07c4 cmp [rcx], ecx
L07c6 call System.Data.DataTableCollection.get_Item(System.String)
L07cb mov [rbp-0x1a0], rax
L07d2 mov rcx, [rbp-0x1a0]
L07d9 cmp [rcx], ecx
L07db call System.Data.DataTable.get_Rows()
L07e0 mov [rbp-0x1a8], rax
L07e7 mov rcx, [rbp-0x1a8]
L07ee xor edx, edx
L07f0 cmp [rcx], ecx
L07f2 call System.Data.DataRowCollection.get_Item(Int32)
L07f7 mov [rbp-0x1b0], rax
L07fe mov rcx, 0x7ffd3096b258
L0808 call 0x00007ffd9050af00
L080d mov [rbp-0x28], rax
L0811 mov r8, [rbp-0x28]
L0815 mov dword ptr [r8+8], 0x64
L081d mov r8, [rbp-0x28]
L0821 mov rdx, 0x1b5d3ceb720
L082b mov rdx, [rdx]
L082e mov rcx, [rbp-0x1b0]
L0835 cmp [rcx], ecx
L0837 call System.Data.DataRow.set_Item(System.String, System.Object)
L083c nop
L083d nop
L083e lea rsp, [rbp]
L0842 pop rbp
L0843 ret
Dazu mehr ist auf Wikipedia in Separation of Concerns zu lesen.