Napsal jsem program, který umožní dva druhy „bojovat“. Z nějakého důvodu vždy vyhrává C #. Co se děje s VB.NET?

hlasů
62

Napsal jsem program, který umožní dva druhy „bojovat“. Z nějakého důvodu vždy vyhrává C #. Co se děje s VB.NET?

   static void Main(string[] args)
    {
        Player a = new A();
        Player b = new B();

        if (a.Power > b.Power)
            Console.WriteLine(C# won);
        else if (a.Power < b.Power)
            Console.WriteLine(VB won);
        else
            Console.WriteLine(Tie);
    }

Zde jsou hráči: Hráč A v C #:

public class A : Player
{
    private int desiredPower = 100;

    public override int GetPower
    {
        get { return desiredPower; }
    }
}

Hráč B ve VB.NET:

Public Class B
   Inherits Player

   Dim desiredPower As Integer = 100

   Public Overrides ReadOnly Property GetPower() As Integer
       Get
          Return desiredPower
       End Get
   End Property
 End Class

A tady je základní třída.

public abstract class Player
{
    public int Power { get; private set; }

    public abstract int GetPower { get; }

    protected Player()
    {
        Power = GetPower;
    }
}
Položena 02/04/2009 v 21:54
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
45

Otázkou zde je, že VB volá základní konstruktor před nastavením její hodnoty pole. Takže class base Player ukládá nula.

.method public specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       15 (0xf)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [base]Player::.ctor()
  IL_0006:  ldarg.0
  IL_0007:  ldc.i4.s   100
  IL_0009:  stfld      int32 B::desiredPower
  IL_000e:  ret
} // end of method B::.ctor
Odpovězeno 02/04/2009 v 22:11
zdroj uživatelem

hlasů
16

Propagaci své připomínky k odpovědi:

Mě:

Zkuste psát každý „sílu“ na konzoli stejně

Vtipálek:

C # 100 VB.NET: 0

Mě:

Jak jsem předpokládal. Vypadá to, VB.Net volá základní konstruktor před zdědil konstruktoru, a proto desiredPower proměnná VB je stále 0, zatímco C # dělá to v opačném směru (pamatujte, že doslovný inicializace se stane na konci tohoto montážního závodu).

Aktualizace:
Chtěl jsem najít nějaké dokumenty týkající se chování (jinak se díváte na chování vás, které by mohly změnit zpod vás při každém novém vydání Net). Z odkazu:

Konstruktoru odvozené třídy implicitně volá konstruktor základní třídy

a

Základní třída objekty jsou vždy postaveny před jakékoliv třídy, které vyplývají. Tak konstruktor základní třídy je proveden před konstruktoru odvozené třídy.

Ti, kteří jsou na stejné straně, a jak se zdá, vzájemně se vylučující, ale beru to tak, že znamená odvozené třídy konstruktor je vyvolána jako první, ale předpokládá se, že samo o sobě vyvolat základní konstruktor před vykonávat žádnou jinou práci. Z tohoto důvodu to není konstruktor uložit důležité, ale způsob, jakým jsou literály inicializaci.

Také jsem našel tento odkaz , který jasně říká, že pořadí je odvozen instance pole, pak základna konstruktoru, pak odvozen konstruktér.

Odpovězeno 02/04/2009 v 22:10
zdroj uživatelem

hlasů
2

V době, kdy konstruktér na B dokončí oba hráči budou mít teoretickou hodnotu 100 ve své soukromé členů.

Nicméně vzhledem k vynikající vestaveb v jazyce C #, CLI obecně toho názoru, celá čísla a další primitivní hodnoty hodnoty sestavené z tohoto jazyka musí být vyšší, a ty z VB.NET být nižší, i když obsahují stejné kousky.

Odpovězeno 02/04/2009 v 22:05
zdroj uživatelem

hlasů
1

To se děje proto, že C # první inicializaci třídy pole a než volání základních konstruktérů. VB místo toho dělá opak, takže když ve VB přiřadit svou hodnotu síly, soukromý sektor není ještě inicializována a jeho hodnota je 0.

Odpovězeno 04/08/2010 v 15:50
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more