在上一篇 委託(Delegate)類型 中我定義public方法的時候使用了 static 關鍵字,導致後來無法通過 對象.方法名 的形式訪問此方法,這一篇我們就具體學習下 static 靜態變數。
變數:
在學習static靜態變數之前,我們還是有必要來瞭解 變數 的意義。程式要對資料進行讀、寫、運算等操作,當需要儲存特定的值或結果的時候就需要用到變數,在使用者看來,變數是用來描述一條資訊的名稱,在變數中可以儲存各種類型的資訊,比如:人的姓名、車票的價格等等;在電腦看來,變數代表格儲存體地址,變數是什麼類型,變數中儲存的數值就是什麼類型。使用變數的一條重要原則就是 :變數必須先定義後使用。
在C# 中變數的定義與使用規則與C/C++類似,這裡就不多說了,(所以學好C還是挺重要的^_^)
static靜態變數:
帶有 static 修飾符聲明的變數稱為靜態變數,一旦靜態變數所屬的類被裝載直到包含該類的程式運行結束時他將一直存在。static 的主要性質有兩個:
1.隱藏:
在類裡定義的靜態方法或靜態變數,屬於類本身,而不屬於那個類的一個對象。要想調用一個被定義為static的方法,必須在它前面加上這個類的名稱。(即時是public訪問修飾也不行,這也是上一篇末尾的原因) 執行個體方法必須通過類的執行個體來使用。執行個體方法可以使用類的非靜態成員,也可以使用類的靜態成員。
訪問規則:
靜態方法只能訪問類的靜態成員,不能訪問類的非靜態成員;
非靜態方法可以訪問類的靜態成員,也可以訪問類的非靜態成員;
靜態方法不能使用執行個體來調用,只能使用類名來調用。
比如下面的例子:
class person { public static int i; //定義一個靜態變數i 預設值是0 public int k=0; //定義一個非靜態變數 k; public static int sbu() // 定義一個靜態方法 { i = 9; //成功對靜態變數賦值 k = 5; //出錯了,無法訪問非靜態變數 return k; //綜上靜態方法只能訪問靜態變數 } public int Add() //定義一個執行個體方法 { i = 9; //對靜態變數賦值沒有問題 k = 5; //對非靜態變數賦值也沒問題 return i; //綜上執行個體方法能夠訪問所有類型變數 } }
我們執行個體化一個person一個對象對方法進行訪問:
static void Main(string[] args) { person per = new person(); //執行個體化一個對象per int i = per.i; //出錯了,per訪問不了類裡的靜態變數 int k = per.k; //沒有問題 per.sbu(); //出錯了,per訪問不了靜態方法 person.sbu(); //成功調用 per.Add(); //成功調用 person.Add(); //出錯了,person訪問不了執行個體方法 }
2.保持變數內容的持久:
儲存在待用資料區的變數會在程式剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域變數和static變數,只不過和全域變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。
寫個例子就知道了(這次我用C++寫了)C#不允許在方法中使用static:
#include<iostream> using namespace std; int main() { for (int i=0;i<4;i++) { static int k =0; //定義一個靜態變數並賦值為0 k++; cout<<k<<endl; //輸出 } return 0; }
結果:
如果上面的代碼中我們去掉 static 此時k=0;變成了非靜態變數,結果只會出現一個數字 1;
常量:
常量就是其質固定不變的量,從資料類型來看常量的類型可以是任意一種實值型別或參考型別。一個常量的聲明就是聲明程式中要用到的常量名稱和他的值。(用法也與C類似)但是在C#中常量一旦定義無法在改變它的值
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace demo { class Program { const int S = 9; // 定義一個常量S並賦值 static void Main(string[] args) { S += 4; //出錯了,常量一旦定義就不能改變常量的值 Console.WriteLine(S); } } }
以上就是 C#學習日記20----static靜態變數 與 常量的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!