沒有唯讀的陣列

2022-03-05 15:39:52 字數 3194 閱讀 5280

c# 中,陣列實際上是物件,而不只是像c 和

c++

中那樣的可定址連續記憶體區域。

array

是所有陣列型別的抽象基型別。可以使用

array

具有的屬性以及其他類成員。這種用法的乙個示例是使用

length

屬性來獲取陣列的長度。

來自msdn的例子:下面的**將

numbers

陣列的長度(為

5

)賦給名為

lengthofnumbers

的變數:

int numbers = ;

int lengthofnumbers = numbers.length;

class testarraysclass

dimensions.", thearray.rank);}}

下面是我遇到的一些問題及解決方法

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

array

;//private readonly int a = new int ;

不能通過編譯

//private readonly int a = new int[5]

能通過編譯

//要想讓a變為乙個真正意義上唯讀的是不能做到的,

//但我們可以做到每次得到的a都是原來定義的a外界對它的改變影響不了它的狀態.

//這就是轉殖

public

int a

} private

int[,] b = new

int[2, 3] ,};

private

int[,] c = new

int[2, 5];

//private int[,] c = new int[2, 5]{};//

不能通過編譯

private

int d = new

int ;

private

int e = new

int{} ;

//private int e = new int;//

不能通過編譯

public testarray()

;//displayarray(a);

}private

void displayarray(int a)}//

這裡ref可能傳入乙個空值

public

void copytolocalarray(ref

int a);}

a.copyto(this.a,0);//這裡是深度拷貝

//本地唯讀的a內的值又發生了變化

displayarray(this.a);

this.a[0] = 100;

displayarray(this.a);

//a[0]

被改變但a是不能說它改變的,它還指向原來的引用,

//但是它裡面的值已經不是原來的了,所以設計唯讀的引用型別是沒有意義的。}//

這裡的out 修飾的b是用來給b賦值的也就是設定b的值

public

void setupoutarray(out

int[,] b)

b=this.b;}}

}與所有的

ref引數一樣,陣列型別的

ref

引數必須由呼叫方明確賦值。因此不需要由接受方明確賦值。可以將陣列型別的

ref

引數更改為呼叫的結果。例如,可以為陣列賦以

null

值,或將其初始化為另乙個陣列。

與所有的

out引數一樣,在使用陣列型別的

out

引數前必須先為其賦值,即必須由被呼叫方為其賦值。

using

system;

using

system.collections.generic;

using

system.text;

namespace

array

;t.copytolocalarray(ref a);

console.writeline( t.a[0]);//

結果:100

t.a[0] = -5;

console.writeline(t.a[0]);//

結果:100 表示沒有修改t.a的值

console.read();}}

}在網上找唯讀陣列的資源時,發現第一條是來自

effective c# 50

條款第二條,早先的時候就拜讀過

effective c# 50

條款,以後有機會把上面的東西掛這。

唯讀修飾的字段只能在建構函式中和初始化的時候用

。根據《

effective c#

》的條款

2,盡可能使用執行時常量而不是編譯時常量

(item 2: item prefer readonly to const)

,除非這個常量是真正意義上的恆定值。

與之對應的還有日期型別等,如果是自定義型別設計為唯讀型別的話那就要讓它的所有屬性對外都是唯讀的,它所有的字段都是私有的。這樣就能達到唯讀效果了,如果這個類中有引用型別還是會失敗。見下面**:

using

system;

using

system.collections.generic;

using

system.text;

namespace

test

}class

readonlyclass

}private

string b ;

public

string b

}private

datetime dt ;

public

datetime dt

}private int myarray;

public int myarray

}public readonlyclass()}}

哪位高手能給出唯讀的陣列的定義方法呀!

唯讀事務和沒有事務

在專案中看到 transactional readonly true 註解 該屬性用於設定當前事務是否為唯讀事務,設定為 true 表示唯讀,false 則表示可讀寫,預設值為 false 例如 transactional readonly true 了解到是唯讀事務,網上搜了下唯讀事務和沒有事務的...

沒有長度的陣列

有人說c語言是乙個很詭異的語言,所以有時候我們會見到一些比較奇怪的定義,比如 struct a 這個看起來確實很奇怪,為什麼陣列沒有定義大小呢?但實際上這段 不僅可以通過大部分編譯器,並且用途還很廣泛。我工作的時候就遇到了不少這樣的 並且還是比較關鍵的 不過實際上事情並沒有那麼複雜和難以理解,不用看...

C C 沒有陣列

在其它高階語言裡,不管是定義 宣告 還是引用,a i 或a 3 都是乙個整體。在 c c 裡,卻是乙個表示式 a i 是運算子 連線兩個實體a和 i。說 c c 並沒有陣列 有以下幾條理由。理由一 c裡沒有陣列形式。陣列 名 a本身就是乙個指標,與常規指標不同的是,它是乙個不能移動的所謂常指標。如在...