2013-12-14 120 views
3

是否可以只讀一個數組。這樣數組的設置值將不被允許。是否有可能在c#中聲明一個數組爲readonly?

這裏我所用只讀關鍵字試過聲明數組。然後我檢查該數組是否只讀使用IsReadOnly屬性。但它永遠不會返回true。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace PrivateExposeConsoleApp 
{ 
    class Program 
    { 
     private static readonly int[] arr = new int[3] { 1,2,3 }; 

     static void Main(string[] args) 
     { 
      // Create a read-only IList wrapper around the array. 
      IList<int> myList = Array.AsReadOnly(arr); 

      try 
      { 
       // Attempt to change a value of array through the wrapper. 
       arr[2] = 100; 
       Console.WriteLine("Array Elements"); 
       foreach (int i in arr) 
       { 
        Console.WriteLine("{0} - {1}", i + "->", i); 
       } 
       Console.WriteLine("---------------"); 
       Console.WriteLine("List Elements"); 
       foreach (int j in myList) 
       { 
        Console.WriteLine("{0} - {1}", j + "->", j); 
       } 
       // Attempt to change a value of list through the wrapper. 
       myList[3] = 50; 
      } 
      catch (NotSupportedException e) 
      { 

       Console.WriteLine("{0} - {1}", e.GetType(), e.Message); 
       Console.WriteLine(); 
      } 



      //if (arr.IsReadOnly) 
      //{ 
      // Console.WriteLine("array is readonly"); 
      //} 
      //else 
      //{ 
      // for (int i = 0; i < arr.Length; i++) 
      // { 
      //  arr[i] = i + 1; 
      // } 

      // foreach (int i in arr) 
      // { 
      //  Console.WriteLine(i); 
      // } 
      //} 

      Console.ReadKey(); 
     } 
    } 
} 

這裏看到我的評論部分。如果我取消註釋,我的arr永遠不會變爲只讀。在聲明中,我清楚地將arr定義爲只讀數據{1,2,3}。我不希望這個價值被重新發現。它應該始終只有1,2,3。

+1

http://msdn.microsoft.com/en-us/library/53kysx7b(v=vs.110).aspx –

回答

4

創建陣列的只讀副本。在Array類本身上定義的方法Array.AsReadOnly<T>(T[] array)應該用於此目的。

的方法接受一個數組作爲參數(你想只讀了一個)並返回一個ReadOnlyCollection<T>

一個例子是如下:

// declaration of a normal example array 
string[] myArray = new string[] { "StackOverflow", "SuperUser", "MetaStackOverflow" }; 

// declaration of a new ReadOnlyCollection whose elements are of type string 
// the string array is passed through the constructor 
// that's is where our array is passed into its new casing 
// as a matter of fact, the ReadOnlyCollection is a wrapper for ordinary collection classes such as arrays 
ReadOnlyCollection<string> myReadOnlyCollection = new ReadOnlyCollection<string>(maArray); 

Console.WriteLine(myReadOnlyCollection[0]); // would work fine since the collection is read-only 
Console.WriteLine(myReadOnlyCollection[1]); // would work fine since the collection is read-only 
Console.WriteLine(myReadOnlyCollection[2]); // would work fine since the collection is read-only 

myReadOnlyCollection[0] = "ServerFault"; // the [] accessor is neither defined nor would it be allowed since the collection is read-only. 

Here你可以找到根據MSDN文檔。


或者你可以簡單地定義一個吸氣劑的方法,如

public T getElement(int index) { return array[index]; } 

爲了使您的陣列只讀 - 從它的類外至少?


關於你使用Array.IsReadOnly MSDN文檔中說,

此屬性始終是所有陣列假的。

這意味着您將不得不使用IList<T>.IsReadOnly而不是arr.IsReadOnly。

here

+0

嗨,謝謝。你可以請一個樣品詳細說明嗎?我只是不希望這被允許用於(INT I = 0;我

+0

我做了更新。 –

+0

你想達到什麼目的? –

6

陣列本身是可變的,並得到你想要的,你需要使用包裝,ReadOnlyCollection<T>行爲。您可以使用arr.AsReadOnly()

+0

嗨。我只想要這個數組(這裏是arr)是隻讀的。可能嗎 ? arr.AsReadOnly()將返回一個ReadOnlyCollection 。這很好,但那不是我的數組。那是另一個對象。 –

+2

+1。 @ kumarch1 - 除了「數組本身是可變的」之外,還需要其他什麼信息? .Net中只有「只讀數組」這樣的東西。 –

相關問題