[英]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.