[英]How to create a dynamic array of int pointers in c#?
我想要來自 C++ 的std::vector<int*> v
之類的東西,但在 C# 中。
我試過List<int*> v
,但編譯器說
CS0306 C# 該類型不能用作類型參數
我想放入int
變量並通過類似 C++ 中的數組進行更改
std::vector<int*> v;
int a = 2;
v.push_back(&a);
v[0] = 4; // (a == 4) true
首先讓我說得很清楚:使用與 C++ 相同的低級指針技術解決 C# 中的問題幾乎總是錯誤的做法。 您通常可以使用更高級別、更安全的技術。 你在這里所做的被稱為“XY 問題”——你對如何解決問題有一個錯誤的想法,你問的是關於錯誤想法的問題,而不是問如何解決真正的問題; 請編輯問題以說出真正的問題是什么。
要回答您提出的問題:要在 C# 中創建一個指針的“動態數組”,您必須創建一個List<IntPtr>
,它是一個“與指針大小相同的整數”的列表。 不要陷入相信IntPtr
表示指向 integer 的指針的陷阱。 IntPtr
是與指針大小相同的 integer 。
然后,您可以將您的int*
s 轉換為IntPtr
並將它們存儲在列表中,然后在完成后再次將它們轉換回來,但同樣,這幾乎總是錯誤的做法,如果您這樣做,那么您就是負責了解有關 .NET memory 管理系統及其工作原理的一切,因為您正在關閉保護 memory 完整性的安全系統。
您相信您了解有關 memory 管理在 C# 中如何工作的一切嗎? 如果不是,則不要在 C# 中使用指針類型。 自 2001 年以來,我一直在 C# 中開發代碼,並且我從未在生產代碼中使用過指針類型。 你不需要它們,如果你認為你需要它們,你可能做錯了什么。
您可以通過為值創建一個包裝器來解決缺少指向值類型的指針的問題,如下所示:
static void Test()
{
var v = new List<EmbeddedInt>();
var a = new EmbeddedInt(2);
v.Add(a);
v[0].Value = 4;
Console.WriteLine(a); // Display 4
}
public class EmbeddedInt
{
public int Value { get; set; }
public override string ToString()
{
return Value.ToString();
}
public EmbeddedInt(int value)
{
Value = value;
}
}
這是一個簡單的例子。
為了能夠在不使用a + 2
而不是a.Value + 2
的情況下計算值,您可以實現一些方法,如運算符。
你唯一不能做的就是重載賦值運算符......
看看這個:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.