簡體   English   中英

如何在 C# 中生成指針數組?

[英]How to generate an array of pointers in C#?

我有這段代碼非常大,我覺得如果我使用指針,我可以大大縮短它。 我真的沒有看到任何其他選擇,因為數組不包含對變量的引用。

我想做的是創建一個指針數組。 然后我將所有“tick”變量放入其中,然后我可以迭代它們以完成如下所示的操作。

[SerializeField] private bool canEatFood = true;
    [SerializeField] private bool canTakeBath = true;
    [SerializeField] private bool canPlay = true;
    [SerializeField] private bool isScared = false;
    [SerializeField] private bool beenPet = false;
    
    private int canEatTick = 0;
    private int canBatheTick = 0;
    private int canPlayTick = 0;
    
    private int beenPetTick = 0;
    private int pettedCount = 0;
    private const int PETS_TO_KILL_PER_CYCLE = 50;
    private const int PET_HAPPINESS_VALUE = 1;

    private const int DEFAULT_STARTING_VALUE = 10;
    private const int DEFAULT_MAX_VALUE = 100;
    private const int DEFAULT_MIN_VALUE = 0;
    private const int DEFAULT_CYCLE_START_VALUE = 0;
    private const int DEFAULT_CYCLE_END_VALUE = 500;

    public void FixedUpdate()
    {
        CheckTicks();
    }

    private void CheckTicks()
    {
        if (!canEatFood && canEatTick >= DEFAULT_CYCLE_END_VALUE)
        {
            canEatTick = DEFAULT_CYCLE_START_VALUE;
            canEatFood = true;
        }
        else if (!canEatFood)
        {
            canEatTick++;
        }

        if (!canTakeBath && canBatheTick >= DEFAULT_CYCLE_END_VALUE)
        {
            canBatheTick = DEFAULT_CYCLE_START_VALUE;
            canTakeBath = true;
        }
        else if (!canTakeBath)
        {
            canBatheTick++;
        }

        if (!canPlay && canPlayTick >= DEFAULT_CYCLE_END_VALUE)
        {
            canPlayTick = DEFAULT_CYCLE_START_VALUE;
            canPlay = true;
        }
        else if (!canPlay)
        {
            canPlayTick++;
        }

        if (beenPet && beenPetTick >= DEFAULT_CYCLE_END_VALUE)
        {
            beenPetTick = DEFAULT_CYCLE_START_VALUE;
            beenPet = false;
            CheckIfPetsShouldKill();
        }
        else if (beenPet)
        {
            beenPetTick++;
        }
    }

我試過

int*[] ticks = new int*[4];

這導致了一個錯誤。

然后我嘗試了

ref int[] ticks = new ref int[4];

這也導致了錯誤。

不要,這不是指針的用途。

你想要使用的是一個類。 你應該將你的變量包裝在一個類中,這也應該包含相關的邏輯:

public class Tick{
    private bool canDoX= true;
    private int tick = 0;
    public event EventHandler CycleEnd;
    // define all the constants
    public void Update(){
        if (!canDoX && tick >= DEFAULT_CYCLE_END_VALUE)
        {
            tick = DEFAULT_CYCLE_START_VALUE;
            canDoX = true;
            CycleEnd?.Invoke(this, EventArgs.Empty);
        }
        else if (!canDoX)
        {
            tick ++;
        }
    }
}

這使您可以創建報價集合,並將邏輯應用於每個報價。 如果需要,您可以使用事件、委托或繼承來自定義行為。

要在 C# 中使用指針,您需要一個不安全的作用域

void example() {

    int*[] tick_safe = new int*[4]; // shows an error

    unsafe {
        int*[] tick_unsafe = new int*[4]; // ok
    }
}

example();

在 visual studio (2022, .NET 7) 中,您必須手動允許項目的不安全代碼:

  • 右鍵單擊您的項目 > 屬性 > 構建 > 常規 > 允許不安全代碼

如果您需要指針的替代方法,您可以使用數組數組

int[][] ticks = new int[4][];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM