由於我們在寫程式時,會去宣告一些變數、常數相關識別詞,並且在class(類別)中會寫一些事情或動作讓程式去運行,然而這個概念就是去定義對於我們所寫的內容,「可以在哪些範圍去做存取用途。」,在開始介紹前先介紹一個小小程式結構概念
一、存取修飾詞
這個是在同一專案下,對於namespace(命名空間)、class(類別)、field(欄位)、Method(方法)去做範圍存取的定義,修飾詞內容如下圖:
對於protected、internal、protected internal部分使用狀況可能會比較難懂,這邊用圖來表示或許會好懂一些。
以上就是存取修飾詞的介紹。
那麼再看一下最上面那個程式結構的例子,大家有注意到嗎!Field(欄位)那邊的宣告,有的沒有加入存取修飾詞,那這樣它存取使用會是在哪兒呢?倘若說有些沒有加入修飾詞的話,在C#中它會有預設修飾詞,如下所示:
在namespace(命名空間) → 預設修飾詞為 public
在Class(類別) →預設修飾詞為internal
在Field(欄位)宣告 →預設修飾詞為privated
另外還有一個static也是一個修飾詞,有時候會出現
Public static...
Private static...
Static...
這樣的形式,這是用來宣告靜態成員的部分。
二、參數修飾詞
很常在撰寫程式時多多少少都會用到傳遞參數的部分,像最上面那個例子
private void talk(ref int dogNum,ref string DogName)
{
...
}
這邊使用的是ref可以將變數名稱的值帶進來,那麼參數out可以把值帶出去,但是要先給予值。
對於傳遞參數部分有三種方法:
1. Call By Value(傳值呼叫):
傳遞方會將實際參數複製一份給接收方,複製那份參數就稱為虛擬參數,實際參數和虛擬參數各佔據不同的記憶體位置。Ex:
Private void main()
{
string DogName = ”吉利”;
string B = talk(DogName);
string C = DogName;
}
private void talk(string dogName)
{
string A = dogName;
dogName = ”湯姆”;
return dogName;
}
此時,就可以將GogName的值直接傳進talk方法中,再經過talk方法中的事情後,return回去就又將改變過的值傳回main()裡。
A、B、C的結果值分別為:
A:吉利
B:湯姆
C:吉利
說明:
(1) 從main()開始執行,先給予DogName=”吉利”這樣的值後,再執行下一行,什麼樣的值要傳給B呢?
(2) 就跑進talk方法來看,此時會將DogName的值傳進talk方法內。
(3) 那麼我們就看到talk方法,開始執行第一行,A所得到的值就會是「吉利」
(4) 繼續再到下一行,修改dogName的值為「湯姆」後,最後再return回去
(5) 再回到main()中,得知talk(DogName)的結果為「湯姆」,因此B的值就為「湯姆」
(6) 那麼由於此方法是傳值呼叫,因此會佔據不同的記憶體位置,故C的值為「吉利」
2. Call By Reference(參考呼叫):
是傳遞參數記憶體的位置給接收方,由於是同一個記憶體位置,所以變動的會是同一個記憶體位置的值,彼此就會互相影響。Ex:
Private void main()
{
string DogName = ”吉利”;
string B = talk(ref DogName);
string C = DogName;
}
private void talk(ref string dogName)
{
string A = dogName;
dogName = ”湯姆”;
return dogName;
}
此時,就可以將DogName的值直接傳進talk方法中,再經過talk方法中的事情後,return回去就又將改變過的值傳回main()裡。跟上一個差別是它是使用同一個記憶體位置,因此會覆蓋過去。
A、B、C的結果值分別為:
A:吉利
B:湯姆
C:湯姆
3. Output parameter(傳出參數):
實際參數和虛擬參數都是佔用相同記憶體位置,Ex:
Private void main()
{
string DogName;
string DogLike;
string B = talk(out DogName,out DogLike);
string C = DogName;
string D = DogLike;
}
private void talk(out string dogName,out string dogLike)
{
dogName = ”吉利”;
dogLike = ”骨頭”;
string msg = dogName + ”愛吃” + dogLike ;
return msg;
}
此時,在main()中可以不用先設定值,直到進入talk方法中時,再給予值即可,再talk經過一系列過程後,除了可以把參數中的值給帶出去外,還可以把return的值也一併帶出去。
B、C、D的結果值分別為:
B:吉利愛吃骨頭
C:吉利
D:骨頭
說明:
(1) 從main()開始執行,先宣告DogName、DogLike,此時可以不用先設定值,接著進入下一行傳什麼值給B呢?
(2) 就進入talk方法來看,這邊有給予dogName、dogLike的值,接著下一行這邊是將字串做串接後再賦予msg值。
(3) 將msg 值return回去
(4) 再看回main()中,此時B接收到的就會是msg的值也就是「吉利愛吃骨頭」,那麼dogName、dogLike的值也會一併傳回去喔!
(5) 接著往下看C、D輸出的值就是C是「吉利」D是「骨頭」
參考內容: