`
zhangziyangup
  • 浏览: 1080073 次
文章分类
社区版块
存档分类
最新评论

C#基础知识整理:基础知识(10) 静态

 
阅读更多

如果想访问某个类的方法或属性,一定要先实例化该类,然后用该类的对象加.号访问。比如:
有一个用户类和一个处理密码(加密和解密)的类。没生成一个用户实例后,处理密码类要对密码进行加密和解密。

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;
                }
            }
        }
    }
}

运行结果:

不过要注意一个问题,一般方法可以访问方法外的静态属性或静态方法。但是如果是静态方法中要访问方法外的属性或方法,那么被访问的属性和方法也必须是静态的。因为一般的属性或方法只有在实例化后才分配空间,才可以使用,而静态中则是直接在编译的时候就分配好了内存空间,因此静态方法中调用其它的属性或方法是不可以的,只能调用同时静态的才可以。

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/4438713

分享到:
评论

相关推荐

    C#基础知识 静态

    C#基础知识 静态

    C#基础知识

    它包含了C#的许多基础知识,例如面向对象、静态类与非静态类的区别,构造函数与析构函数的区别,out和ref关键字的区别,C#中的垃圾回收机制,递归,冒泡排序,自定义遍历器,事件与委托,集合类的说明等重要知识点。

    C#_基础培训

    Part3:面向对象编程基础知识 面向对象的概念 抽象化与建模基础 面向对象设计方法和面向对象编程技术 C#中类的组织结构 方法成员 数据成员 成员的使用范围 特殊的成员:静态成员 对象的建立和构造器

    深入理解C# 中文第三版

    第一部分基础知识 第1章C#开发的进化史 第2章C# 1所搭建的核心基础 第二部分C# 2:解决C# 1的问题 第3章用泛型实现参数化类型 第4章可空类型 第5章进入快速通道的委托 第6章实现迭代器的捷径 第7章结束C# 2...

    C# 变量相关基础知识.docx

    是用来存储数据值的一个标识符,可以在程序中被引用和修改。在C#中,变量需要先声明后使用,并且需要指定变量的数据类型。...C#中的变量可以是局部变量、成员变量、静态变量等,具有不同的作用域和生命周期。

    C#操作webservice(经典入门教程及实例)

    介绍WebService基础知识,并使用C#实现操作WebService的基本步骤。

    C#面向对象编程 源码

    本书既阐述了C#的基础知识,又介绍了C#的高级应用技术,包括多线程、异步调用、图形图像处理、游戏编程、与COM等非托管代码的互操作,以及插件编程等。 本书适合所有希望了解和掌握C#和.NET的开发人员阅读,是大专...

    C# 基础知识系列- 13 常见类库介绍(二)日期时间类

    正确的说法是C#中静态类不包含常规构造函数,但可以添加一个静态构造函数。 静态构造函数与普通普通构造函数的区别是,静态构造函数没有访问修饰符,即访问修饰符是默认的,且静态构造函数只能是无参的,并添加 ...

    Visual C# 2010程序设计教程(教程PPT+源代码)

     《高等学校计算机应用规划教材:Visual C# 2010程序设计教程》详细介绍了Visual C# 2010程序设计的基础知识、基本方法和应用技巧,共分14章,主要内容包括.NET平台与Visual Studio 2010开发环境、C#语言基础及面向...

    C#.Net基础5 基础入门知识 数据类型 范例 ppt 实例 可以直接运行

    4、c#中的语法结构 分支结构: if if-else 选择结构: while do-while for 5、常量 声明的常量的语法: const 变量类型 变量名=值; 什么时候会用到常量? 6、枚举 语法: [public] enum 枚举名 { 值1, 值2, 值...

    面向对象的基础知识及技术

    主要介绍.Net Framework基本框架,.Net Framework的优点及开发平台。C#中类与对象的基本概念,包括数据的抽象与封装、构造函数,方法与属性,参数传递,静态成员

    C#.Net基础7 基础入门知识 函数 范例 ppt

    2)、使用静态字段来模拟全局变量。 如果调用者想要得到被调用者的值: 1)、返回值 2、 不管是实参还是形参,都是在内存中开辟了空间的。 3、方法的功能一定要单一。 GetMax(int n1,int n2) 方法中最忌讳的就是...

    C# 基础教程

    第三章 面向对象编程的基础知识 21 3.1一切都是“对象” 22 3.1.1 对象和类 24 3.1.2 实例化 25 3.2 面向对象编程语言的三大原则 26 3.2.1 封装 26 3.2.2 继承 28 3.2.3 多态性 30 3.4 本章小结 33 3.5 实战演练 33 ...

    轻松学C#(图解版)

    除了详细地讲解C#知识点外,本书还提供了大量的实例,供读者实战演练。本书共分三篇。第一篇是C#概述篇,主要介绍的是Visual Studio 2012的开发环境及搭建。第二篇是面向对象基础篇,主要介绍类、对象、字段、方法、...

    c#学习笔记.txt

    Sun就从来没有将它的Java交给过ECMA,以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违反了许可证协议中...

    C#微软培训资料

    第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型 .28 4.2 引 用 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 ...

    C#基础知识系列八const和readonly关键字详细介绍

    在了解这两个关键字的时候我们先来了解一下静态常量和动态常量。  静态常量:是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。  而动态常量的值则是在运行的那一刻才获得的,编译器编译...

    关于C#基础知识回顾–反射(二)

    对于静态方法,ob必须为null。所有需要传递给方法的参数都必须在args数组中指定。如果方法不需要参数,则args必须为null。另外,数组args的元素数量参数必须等于参数的数量。Invoke()方法返回被调用方法的返回值。...

Global site tag (gtag.js) - Google Analytics