在學習static靜態變量之前,我們還是有必要來了解 變量 的意義。程序要對數據進行讀、寫、運算等操作,當需要保存特定的值或結果的時候就需要用到變量,在用戶看來,變量是用來描述一條信息的名稱,在變量中可以儲存各種類型的信息,比如:人的姓名、車票的價格等等;在計算機看來,變量代表存儲地址,變量是什麼類型,變量中存儲的數值就是什麼類型。使用變量的一條重要原則就是 :變量必須先定義後使用。
在C# 中變量的定義與使用規則與C/C++類似,這裡就不多說了,(所以學好C還是挺重要的^_^)
帶有 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:
#includeusing namespace std; int main() { for (int i=0;i<4;i++) { static int k =0; //定義一個靜態變量並賦值為0 k++; cout< 結果:
如果上面的代碼中我們去掉 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); } } }