Vra

Kom ons sê ons het die volgende metode verklaring:

Public Function MyMethod(ByVal param1 As Integer, _
    Optional ByVal param2 As Integer = 0, _
    Optional ByVal param3 As Integer = 1) As Integer

    Return param1 + param2 + param3
End Function

Hoe VB.NET maak die opsionele parameters werk binne die grense van die CLR? Is opsioneel parameters CLS-Compliant?

Was dit nuttig?

Oplossing

Dis interessant dat hierdie is die decompiled C # kode, verkry via reflector.

public int MyMethod(int param1, 
                   [Optional, DefaultParameterValue(0)] int param2, 
                   [Optional, DefaultParameterValue(1)] int param3)
{
    return ((param1 + param2) + param3);
}

Let op die Opsionele en DefaultParameterValue skryf. Probeer om hulle in C # metodes. Jy sal vind dat jy nog steeds nodig om waardes te slaag om die metode. In VB-kode egter sy verander in Default! Dit gesê, ek persoonlik het nog nooit gebruik Default selfs in VB kode. Dit voel soos 'n hak. Metode oorlading doen die truuk vir my.

Standaard help nie al is, wanneer hulle met die Excel Interop, wat is 'n pyn in die gat om reguit te gebruik uit die boks in C #.

Ander wenke

In teenstelling met die algemene opvatting, opsionele parameters verskyn om CLS-compliant wees. (Maar my primêre tjek hiervoor was om die vergadering, klas en metode al met die CLSCompliant kenmerk, gestel is te merk.)

So wat beteken dit lyk in MSIL?

.method public static int32  MyMethod(int32 param1,
                                      [opt] int32 param2,
                                      [opt] int32 param3) cil managed
{
  .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = ( 01 00 01 00 00 ) 
  .param [2] = int32(0x00000000)
  .param [3] = int32(0x00000001)
  // Code size       11 (0xb)
  .maxstack  2
  .locals init ([0] int32 MyMethod)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.1
  IL_0003:  add.ovf
  IL_0004:  ldarg.2
  IL_0005:  add.ovf
  IL_0006:  stloc.0
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.0
  IL_000a:  ret
} // end of method Module1::MyMethod

Let op die [opt] merke op die parameters - MSIL ondersteun hierdie native, sonder enige hacks. (In teenstelling met ondersteuning MSIL se vir VB se Static navraag, wat is 'n ander onderwerp geheel en al.)

So, hoekom is dit nie in C #? Ek kan nie antwoord dat, anders as my spekulasie dat dit 'n vermeende gebrek aan vraag kan wees. My eie voorkeur was nog altyd om die parameters spesifiseer, selfs al is hulle opsionele was - om my, die kode lyk skoner en makliker om te lees. (As daar is weggelaat parameters, ek sien dikwels eers vir 'n oorlading wat ooreenstem met die sigbare handtekening - dis eers nadat ek in gebreke bly om die een wat ek besef dat opsionele parameters is betrokke te kry.)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top