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

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#编程语言中,"静态"(Static)是一个非常重要的关键字,它有着广泛的用途,涉及到类、方法、变量等多个方面。本篇文章将深入探讨C#中的静态概念及其应用。 首先,静态类(Static Class)是不能被实例化的,它们...

    C#基础知识 C#基础知识的总结

    以下是C#基础知识的总结,涵盖了语言特性、关键字、数据类型、操作符、控制结构、函数、类和对象等方面: 语言特性 C#是一种静态类型、面向对象的编程语言。 C#支持结构化编程、面向对象编程和泛型编程。 C#支持...

    C#知识整理(完整)

    本资源提供了C#基础知识的系统整理,对于期末考试有一定的帮助作用。下面是从给定的文件中生成的相关知识点: 第一章 1. C#应用程序可以使用除Word应用程序以外的工具和方法进行开发。 2. 命名空间可以签到。 3. ...

    C#基础知识系统汇总

    ### C#基础知识系统汇总 #### 一、C#概述 C#是一种面向对象的编程语言,结合了C++的强大特性和Java的优雅风格,以及BASIC的易用性。它由微软开发,主要应用于Windows平台上的软件开发。C#不仅支持传统的桌面应用...

    C#基础知识 C#数组

    总的来说,C#数组是数据存储和处理的基础工具,了解并掌握数组的概念、操作和与其他C#特性的交互,是成为一名合格的C#程序员不可或缺的知识。通过不断学习和实践,我们可以构建更复杂、高效的程序。

    c#基础知识概述(WORD文档)

    本篇将详细阐述C#的基础知识,旨在为初学者提供全面的入门指导。 1. 引用类型与内存管理 C#中的引用类型包括String、数组、类、接口和委托。它们的内存分配在堆上,通过指针地址进行访问。引用类型的特点是安全性,...

    C#基础编程实战:圆的计算与条件判断应用实例解析

    适合人群:针对想要初步接触或巩固自己对C#基础知识掌握情况的学习者,特别适用于刚开始学习编程的学生或者是有一定经验但新接触到C#这门语言的开发者。 使用场景及目标:该资源用于个人自学或者课堂教学当中作为...

    c#基础知识个人总结

    本篇文章将根据“c#基础知识个人总结”这一主题,深入探讨C#的基础知识,包括面向对象的概念、特性以及相关例题解析。 1. **C#基础语法** - 变量:C#中的数据类型分为值类型(如int、bool)和引用类型(如类、接口...

    C#基础知识 基类Object

    本文将深入探讨C#中的基础知识,特别是与基类Object相关的概念。Object是所有C#类的根,无论你创建何种类,它们最终都将继承自Object类。 1. **对象的概念**:在C#中,对象是类的实例。类是一种模板,定义了数据...

    c# 编程基础知识(基础资料)

    ### C# 编程基础知识详解 #### 一、类型和变量 C# 是一种静态类型的语言,其中的数据类型被划分为两大类:**值类型** 和 **引用类型**。 ##### 值类型(ValueType) 值类型包括: - **简单类型(Simple Type)**...

    c# 基础知识概论

    C#基础知识概论涵盖了语言的基本元素、数据类型、控制结构、函数、类和对象等核心概念。 1. **基本语法与数据类型**: - C#语法与C++和Java类似,具有严格的类型检查。它支持多种数据类型,包括基本类型(如整型、...

    C#基础C#基础C#基础

    以上只是C#基础知识的一部分,实际学习过程中,还需要了解更多的高级特性,如委托、事件、匿名方法、Lambda表达式、匿名类型、动态类型、扩展方法、元数据等。C#是一个不断发展和演进的语言,随着.NET Core的推出,...

    C# 基础知识概论

    ### C#基础知识概论 #### 一、C#的产生——.NET基本概念简介 C#,作为一种由微软开发的编程语言,其诞生背景紧密关联于.NET框架的推出。.NET框架是微软针对Web Service解决方案的一项重大创新,旨在提供一个支持下...

    C#资料汇总 基础知识 核心知识 读书笔记

    1. **C#基础知识**: - 类型系统:C#是一种强类型语言,变量必须先声明类型再使用。 - 变量:包括基本类型(如int、float、bool等)和引用类型(如类、接口、数组等)。 - 控制结构:包括条件语句(if-else)、...

    C#基础知识 委托事件

    而`Inherit`和`AboutObject`可能涉及类继承和对象相关的内容,这些也是C#基础知识的重要部分。`Static`可能展示了静态类和静态成员的用法,`Collection`可能涉及C#集合框架,如数组、列表和字典等数据结构的使用。 ...

    c#手机编程基础知识

    1. **C#基础**: - **变量与数据类型**:了解基本的数据类型如整型、浮点型、字符串以及引用类型,并理解变量的声明、赋值和作用域。 - **控制结构**:包括条件语句(if-else, switch)和循环(for, while, do-...

    c#知识集合,C#基本知识等

    这个压缩包包含了一系列关于C#基础知识的文章和教程,涵盖了多个关键概念,包括委托、随机数、窗体间数据传递、命名空间、常用函数和方法,以及文件I/O操作。以下是这些知识点的详细说明: 1. **委托**:在C#中,...

    C#基础知识点合集

    C#是一种广泛应用于软件开发...通过学习这些文档和笔记,开发者可以建立起坚实的C#基础,理解类成员的核心概念,并进一步探索更复杂的C#特性和应用。在实际项目中,这些基础知识将有助于创建高效、可靠的软件解决方案。

    c#基础知识25个常见问题.pdf

    以下是对标题和描述中涉及的一些C#基础知识的详细解释: 1. 静态变量与非静态变量的区别: 静态变量属于类,而非静态变量属于类的实例。静态变量在类加载时初始化,所有实例共享同一静态变量的值。而非静态变量在...

    C#课件C#基础知识.ppt

    9. 构造函数:C# 支持静态构造函数和实例构造函数,Java 只有实例构造函数。10. 委托(Delegate)与事件:C# 中的委托类似于 Java 的函数式接口,但委托可以用于事件处理,Java 通过监听器模式实现事件。 在 C# 中...

Global site tag (gtag.js) - Google Analytics