在上一篇 委託(Delegate)類型 中我定義public方法的時候使用了 static 關鍵字,導致後來無法透過 物件.方法名 的形式存取此方法,這篇文章我們就具體學習下 static 靜態變數。
變數:
在學習static靜態變數之前,我們還是有必要來了解 變數 的意義。程式要對資料進行讀取、寫入、運算等操作,當需要保存特定的值或結果的時候就需要用到變量,在使用者看來,變數是用來描述一條訊息的名稱,在變數中可以儲存各種類型的信息,例如:人的姓名、車票的價格等等;在計算機看來,變數代表儲存位址,變數是什麼類型,變數中儲存的數值就是什麼類型。使用變數的一個重要原則是 :變數必須先定義後使用。
在C# 中變數的定義與使用規則與C/C++類似,這裡就不多說了,(所以學好C還是挺重要的^_^)
stat 符聲明的變數稱為靜態變量,一旦靜態變數所屬的類別被裝載直到包含該類別的程式運行結束時他將一直存在。 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; //综上实例方法能够访问所有类型变量 } }
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 此時我們去掉;變成了非靜態變量,結果只會出現一個數字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); } } }