C#基礎知識整理:基礎知識(10) 靜態

來源:互聯網
上載者:User
如果想訪問某個類的方法或屬性,一定要先執行個體化該類,然後用該類的對象加.號訪問。比如:
有一個使用者類和一個處理密碼(加密和解密)的類。沒產生一個使用者執行個體後,處理密碼類要對密碼進行加密和解密。

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)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.