programing

저는 두 개의 수업을 "싸울" 수 있는 프로그램을 만들었습니다.어떤 이유에서든 C#이 항상 승리합니다.VB.NET에 무슨 문제가 있나요?

subpage 2023. 5. 29. 10:53
반응형

저는 두 개의 수업을 "싸울" 수 있는 프로그램을 만들었습니다.어떤 이유에서든 C#이 항상 승리합니다.VB.NET에 무슨 문제가 있나요?

저는 두 개의 수업을 "싸울" 수 있는 프로그램을 만들었습니다.어떤 이유에서든 C#이 항상 승리합니다.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");
    }

다음 선수들이 있습니다: C#의 A 선수:

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

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

VB.NET의 플레이어 B:

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

그리고 이것은 기본 클래스입니다.

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

    public abstract int GetPower { get; }

    protected Player()
    {
        Power = GetPower;
    }
}

여기서 문제는 VB가 필드 값을 설정하기 전에 기본 생성자를 호출한다는 것입니다.기본 플레이어 클래스는 0을 저장합니다.

.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

내 의견을 답변으로 승격:

나:

콘솔에도 각 "전원"을 기록해 보십시오.

장난꾸러기:

C#: 100 VB.NET: 0

나:

역시.VB 같은데요.Net은 상속된 생성자보다 먼저 기본 생성자를 호출하므로 VB의 원하는 Power 변수는 여전히 0인 반면 C#은 반대로 수행합니다(Literal Initialization은 생성자의 끝에서 발생합니다).

업데이트:
저는 그 행동에 대한 문서를 찾고 싶었습니다(그렇지 않으면 당신은 새로운 행동으로 인해 당신 밑에서 바뀔 수도 있는 행동을 보고 있습니다).순 릴리스).링크에서:

파생 클래스의 생성자가 기본 클래스의 생성자를 암시적으로 호출합니다.

그리고.

기본 클래스 개체는 항상 파생 클래스보다 먼저 생성됩니다.따라서 기본 클래스의 생성자는 파생 클래스의 생성자보다 먼저 실행됩니다.

이들은 같은 페이지에 있으며 서로 배타적인 것처럼 보이지만 파생 클래스 생성자가 먼저 호출되지만 다른 작업을 수행하기 전에 기본 생성자가 스스로 호출되는 것으로 가정됩니다.그러므로 그것은 시공자나 순서가 아니라 리터럴이 초기화되는 방식입니다.

저는 또한참조를 찾았습니다. 이 참조는 순서가 파생 인스턴스 필드, 다음은 기본 생성자, 다음은 파생 생성자입니다.

B의 생성자가 완료될 때까지, 두 플레이어는 개인 멤버에서 이론적 가치 100을 갖게 될 것입니다.

그러나 C#의 내부가 우수하기 때문에 CLI는 일반적으로 정수 및 해당 언어에서 컴파일된 다른 원시 값이 더 높고 VB.NET의 값이 더 낮은 것으로 간주합니다. 동일한 비트가 포함된 경우에도 마찬가지입니다.

이것은 C#이 먼저 클래스 필드를 초기화하고 기본 생성자를 호출하기 때문에 발생합니다. 대신 VB는 그 반대의 작업을 수행하므로 VB에서 값을 Power에 할당할 때 개인 필드는 아직 초기화되지 않고 값은 0입니다.

언급URL : https://stackoverflow.com/questions/711586/i-wrote-a-program-that-allow-two-classes-to-fight-for-whatever-reason-c-sharp

반응형