2014-04-09 59 views
2

如何將值類型的引用存儲在列表中?如何將值類型的引用存儲在列表中?

在下面的代碼,

int x = 1; 
list<int> l = new list<int>(); 
l.add(x); 
x = 2; 
l[0].toString(); 

希望L [0]的ToString()將。
我試圖解決使用ref,但我不能做,並找到任何解決方案。

+2

你不能這樣做,值類型,即使是引用類型,你會看到更多的副作用,不是真實的參考*(您不能將其設置爲空)*。你爲什麼需要這樣的東西?如果您可以清楚瞭解您的要求,那麼可能會更好。 – Habib

+0

使用像'StrongBox '這樣的容器很醜,但可能會起作用。 – leppie

+1

「值類型的引用」...否。 –

回答

-2

您還需要更新列表中的X

int x = 1; 
list<int> l = new list<int>(); 
l.add(x); 
x = 2; 
l[0] = x; 
l[0].toString(); 

將返回:

+2

好啊,但這不是問題 – Jonesopolis

+0

我只想通過列表訪問** x **而不更新。 –

0

因爲它是值類型,你不能把它像參考(類)類型。上面的代碼將不起作用,因爲int是一個值類型。

可以創建class,在List舉行的int和存儲實例,然後通過在類get/set存取修改int值。

這有道理嗎?

+0

引用類型也將不起作用... – leppie

+0

對於您的編輯:不,這也行不通。 – leppie

+1

@leppie - 在列表中存儲引用類型*將*執行他正在嘗試完成的任務,它在將項目添加到列表後將更改項目的值。 – edtheprogrammerguy

0

冒着被低估的風險..這裏有一種方法可以做你想做的事。我給你槍,希望你不要自己射擊。

雖然有趣,

unsafe { 
    var x = stackalloc int[1]; 
    *x = 1; 

    var list = new List<IntPtr>() { (IntPtr)x }; 

    (*x)++; 

    Console.WriteLine(*((int*)list[0])); // prints "2" 
} 
+0

4分鐘,沒有downvotes。我很高興人們已經接受,我給了OP預警:) –

+0

看起來像有人注意到不安全的關鍵字...另外,保持對超出'x'範圍的引用將是相當有問題的 - 在這一點上,'x'可以只是'int x = 1;新列表 {(IntPtr)(&x) }; x ++;'。 – Mitch

+0

贏得一些......失去一些.. :) –

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); 
} 
+0

我會刪除那些隱式運算符,至少將'T'作爲'ReferenceValue ',否則它可能會不明白爲什麼它不起作用; p – leppie

+0

@leppie,我刪除了我的其他評論。請原諒,我正在睡眠不足。關於隱式轉換的觀點很好。 – Mitch

相關問題