如果想訪問某個類的方法或屬性,一定要先執行個體化該類,然後用該類的對象加.號訪問。比如:
有一個使用者類和一個處理密碼(加密和解密)的類。沒產生一個使用者執行個體後,處理密碼類要對密碼進行加密和解密。
using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO;namespace YYS.CSharpStudy.MainConsole.Static{ /// <summary> /// 使用者類 /// </summary> public class User { //加密解密用到的Key private string key = "20120719"; //加密解密用到的向量 private string ivalue = "12345678"; private string userName; private string userEncryptPassword; private string userDecryptPassword; /// <summary> /// 使用者名稱 /// </summary> public string UserName { get { return userName; } } /// <summary> /// 使用者密碼,加密後的密碼 /// </summary> public string UserEncryptPassword { get { return userEncryptPassword; } } /// <summary> /// 使用者密碼,解密後的密碼 /// </summary> public string UserDecryptPassword { get { DES des = new DES(); this.userDecryptPassword = des.Decrypt(userEncryptPassword, key, ivalue); return userDecryptPassword; } } /// <summary> /// 建構函式 /// </summary> /// <param name="userName"></param> /// <param name="userPassword"></param> public User(string userName, string userPassword) { this.userName = userName; DES des = new DES(); this.userEncryptPassword = des.Encrypt(userPassword, key, ivalue); } } /// <summary> /// 處理密碼的類 /// </summary> public class DES { /// <summary> /// 加密字串 /// </summary> public string Encrypt(string sourceString, string key, string iv) { try { byte[] btKey = Encoding.UTF8.GetBytes(key); byte[] btIV = Encoding.UTF8.GetBytes(iv); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); using (MemoryStream ms = new MemoryStream()) { byte[] inData = Encoding.UTF8.GetBytes(sourceString); try { using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)) { cs.Write(inData, 0, inData.Length); cs.FlushFinalBlock(); } return Convert.ToBase64String(ms.ToArray()); } catch { return sourceString; } } } catch { } return sourceString; } /// <summary> /// 解密字串 /// </summary> public string Decrypt(string encryptedString, string key, string iv) { byte[] btKey = Encoding.UTF8.GetBytes(key); byte[] btIV = Encoding.UTF8.GetBytes(iv); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); using (MemoryStream ms = new MemoryStream()) { byte[] inData = Convert.FromBase64String(encryptedString); try { using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write)) { cs.Write(inData, 0, inData.Length); cs.FlushFinalBlock(); } return Encoding.UTF8.GetString(ms.ToArray()); } catch { return encryptedString; } } } }}
調用:
class Program { static void Main(string[] args) { User user = new User("yangyoushan", "000000"); Console.WriteLine(string.Format("使用者名稱:{0}", user.UserName)); Console.WriteLine(string.Format("加密後的密碼:{0}", user.UserEncryptPassword)); Console.WriteLine(string.Format("明文的密碼:{0}", user.UserDecryptPassword)); Console.ReadKey(); } }
結果:
這兩個類實現的代碼裡面,有兩個問題。
1、對於每執行個體化一個user,都要運行
DES des = new DES(); this.userEncryptPassword = des.Encrypt(userPassword, key, ivalue);
也就是每次都要執行個體化一個DES執行個體。這樣是不好的,執行個體化DES只是為了調用它的方法而已,但是每次調用方法都有要執行個體化卻是不太方便,而且也增加了記憶體的消耗。
2、對於
//加密解密用到的Key private string key = "20120719"; //加密解密用到的向量 private string ivalue = "12345678";
這兩個變數是每個user執行個體都要用到的,而且不會變化。但是每執行個體化一個user都要分配空間,同樣也是對記憶體有消耗的,而且就物件導向思想來說,也不大合理。
既然這樣,那麼最好是將DES的兩個方法公用出來,而且不用通過執行個體化就能直接調用就好。比如Math的所有方法(Math.Abs(1);)。再一個就是將User裡的key和ivalue變數也設定為公用,而且也可以直接存取,並且只分配一次記憶體空間,而執行個體化user時不用再另外分配了。
這就要用到靜態,即static關鍵字。所謂靜態就是,成員被一個類所共用。也就是說被聲明為靜態成員不屬於一個特定的類的對象,屬於這個類所有對象。所有類的成員都可以聲明為靜態,可以聲明靜態欄位、靜態屬性或靜態方法。不過這裡要區別一下const和static,const是指常量在程式運行中是不能改變值的,static則可以在運行中改變值,而且一個地方改變,其它地方訪問到的都是改變後的值。
這樣就可以利用靜態,來最佳化上述的代碼,如下:
using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO;namespace YYS.CSharpStudy.MainConsole.Static{ /// <summary> /// 使用者類 /// </summary> public class User { //加密解密用到的Key private static string key = "20120719"; //加密解密用到的向量 private static string ivalue = "12345678"; private string userName; private string userEncryptPassword; private string userDecryptPassword; /// <summary> /// 使用者名稱 /// </summary> public string UserName { get { return userName; } } /// <summary> /// 使用者密碼,加密後的密碼 /// </summary> public string UserEncryptPassword { get { return userEncryptPassword; } } /// <summary> /// 使用者密碼,解密後的密碼 /// </summary> public string UserDecryptPassword { get { //使用靜態方法和靜態欄位 this.userDecryptPassword = DES.Decrypt(userEncryptPassword, key, ivalue); return userDecryptPassword; } } /// <summary> /// 建構函式 /// </summary> /// <param name="userName"></param> /// <param name="userPassword"></param> public User(string userName, string userPassword) { this.userName = userName; this.userEncryptPassword = DES.Encrypt(userPassword, key, ivalue); } } /// <summary> /// 處理密碼的類 /// </summary> public class DES { /// <summary> /// 加密字串 /// </summary> public static string Encrypt(string sourceString, string key, string iv) { try { byte[] btKey = Encoding.UTF8.GetBytes(key); byte[] btIV = Encoding.UTF8.GetBytes(iv); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); using (MemoryStream ms = new MemoryStream()) { byte[] inData = Encoding.UTF8.GetBytes(sourceString); try { using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)) { cs.Write(inData, 0, inData.Length); cs.FlushFinalBlock(); } return Convert.ToBase64String(ms.ToArray()); } catch { return sourceString; } } } catch { } return sourceString; } /// <summary> /// 解密字串 /// </summary> public static string Decrypt(string encryptedString, string key, string iv) { byte[] btKey = Encoding.UTF8.GetBytes(key); byte[] btIV = Encoding.UTF8.GetBytes(iv); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); using (MemoryStream ms = new MemoryStream()) { byte[] inData = Convert.FromBase64String(encryptedString); try { using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write)) { cs.Write(inData, 0, inData.Length); cs.FlushFinalBlock(); } return Encoding.UTF8.GetString(ms.ToArray()); } catch { return encryptedString; } } } }}
運行結果:
不過要注意一個問題,一般方法可以存取方法外的靜態屬性或靜態方法。但是如果是靜態方法中要存取方法外的屬性或方法,那麼被訪問的屬性和方法也必須是靜態。因為一般的屬性或方法只有在執行個體化後才分配空間,才可以使用,而靜態中則是直接在編譯的時候就分配好了記憶體空間,因此靜態方法中調用其它的屬性或方法是不可以的,只能調用同時靜態才可以。
以上就是C#基礎知識整理:基礎知識(10) 靜態內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!