如何將值類型的引用存儲在列表中?如何將值類型的引用存儲在列表中?
在下面的代碼,
int x = 1;
list<int> l = new list<int>();
l.add(x);
x = 2;
l[0].toString();
希望L [0]的ToString()將。
我試圖解決使用ref,但我不能做,並找到任何解決方案。
如何將值類型的引用存儲在列表中?如何將值類型的引用存儲在列表中?
在下面的代碼,
int x = 1;
list<int> l = new list<int>();
l.add(x);
x = 2;
l[0].toString();
希望L [0]的ToString()將。
我試圖解決使用ref,但我不能做,並找到任何解決方案。
您還需要更新列表中的X
int x = 1;
list<int> l = new list<int>();
l.add(x);
x = 2;
l[0] = x;
l[0].toString();
將返回:
好啊,但這不是問題 – Jonesopolis
我只想通過列表訪問** x **而不更新。 –
因爲它是值類型,你不能把它像參考(類)類型。上面的代碼將不起作用,因爲int
是一個值類型。
您可以創建class
,在List
舉行的int和存儲實例,然後通過在類get/set
存取修改int值。
這有道理嗎?
引用類型也將不起作用... – leppie
對於您的編輯:不,這也行不通。 – leppie
@leppie - 在列表中存儲引用類型*將*執行他正在嘗試完成的任務,它在將項目添加到列表後將更改項目的值。 – edtheprogrammerguy
冒着被低估的風險..這裏有一種方法可以做你想做的事。我給你槍,希望你不要自己射擊。
雖然有趣,
unsafe {
var x = stackalloc int[1];
*x = 1;
var list = new List<IntPtr>() { (IntPtr)x };
(*x)++;
Console.WriteLine(*((int*)list[0])); // prints "2"
}
4分鐘,沒有downvotes。我很高興人們已經接受,我給了OP預警:) –
看起來像有人注意到不安全的關鍵字...另外,保持對超出'x'範圍的引用將是相當有問題的 - 在這一點上,'x'可以只是'int x = 1;新列表
贏得一些......失去一些.. :) –
使用包裝類:
class ReferenceValue<T>
{
public T Value { get; set; }
public ReferenceValue()
{
}
public ReferenceValue(T value)
{
this.Value = value;
}
public static implicit operator ReferenceValue<T>(T v)
{
return new ReferenceValue<T> { Value = v };
}
public static implicit operator T(ReferenceValue<T> r)
{
return r.Value;
}
// would be useful to override equality, == and comparison operators
public override string ToString()
{
var val = this.Value;
if (val != null)
{
return val.ToString();
}
else
{
return base.ToString();
}
}
}
用途:
var list = new List<ReferenceValue<int>>(new ReferenceValue<int>[] { 1, 2, 3 });
var ref1 = list[0];
var ref2 = new ReferenceValue<int>(4);
list.Add(5);
list.Add(ref2);
list[3].Value = 4;
ref2.Value = 5;
ref1.Value = 0;
// Prints: 02345
foreach (var val in list)
{
Console.Write(val.Value);
}
你不能這樣做,值類型,即使是引用類型,你會看到更多的副作用,不是真實的參考*(您不能將其設置爲空)*。你爲什麼需要這樣的東西?如果您可以清楚瞭解您的要求,那麼可能會更好。 – Habib
使用像'StrongBox'這樣的容器很醜,但可能會起作用。 –
leppie
「值類型的引用」...否。 –