博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#基础知识整理:基础知识(10) 静态
阅读量:6417 次
发布时间:2019-06-23

本文共 9176 字,大约阅读时间需要 30 分钟。

    如果想访问某个类的方法或属性,一定要先实例化该类,然后用该类的对象加.号访问。比如:

有一个用户类和一个处理密码(加密和解密)的类。没生成一个用户实例后,处理密码类要对密码进行加密和解密。

using System;  using System.Collections.Generic;  using System.Text;  using System.Security.Cryptography;  using System.IO;    namespace YYS.CSharpStudy.MainConsole.Static  {      ///       /// 用户类      ///       public class User      {          //加密解密用到的Key          private string key = "20120719";          //加密解密用到的向量          private string ivalue = "12345678";            private string userName;            private string userEncryptPassword;            private string userDecryptPassword;            ///           /// 用户名          ///           public string UserName          {              get              {                  return userName;              }          }          ///           /// 用户密码,加密后的密码          ///           public string UserEncryptPassword          {              get              {                  return userEncryptPassword;              }          }          ///           /// 用户密码,解密后的密码          ///           public string UserDecryptPassword          {              get              {                  DES des = new DES();                    this.userDecryptPassword = des.Decrypt(userEncryptPassword, key, ivalue);                    return userDecryptPassword;              }          }            ///           /// 构造函数          ///           ///           ///           public User(string userName, string userPassword)          {              this.userName = userName;                DES des = new DES();                this.userEncryptPassword = des.Encrypt(userPassword, key, ivalue);          }      }        ///       /// 处理密码的类      ///       public class DES      {          ///           /// 加密字符串          ///           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;          }            ///           /// 解密字符串          ///           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  {      ///       /// 用户类      ///       public class User      {          //加密解密用到的Key          private static string key = "20120719";          //加密解密用到的向量          private static string ivalue = "12345678";            private string userName;            private string userEncryptPassword;            private string userDecryptPassword;            ///           /// 用户名          ///           public string UserName          {              get              {                  return userName;              }          }          ///           /// 用户密码,加密后的密码          ///           public string UserEncryptPassword          {              get              {                  return userEncryptPassword;              }          }          ///           /// 用户密码,解密后的密码          ///           public string UserDecryptPassword          {              get              {                  //使用静态方法和静态字段                  this.userDecryptPassword = DES.Decrypt(userEncryptPassword, key, ivalue);                    return userDecryptPassword;              }          }            ///           /// 构造函数          ///           ///           ///           public User(string userName, string userPassword)          {              this.userName = userName;                this.userEncryptPassword = DES.Encrypt(userPassword, key, ivalue);          }      }        ///       /// 处理密码的类      ///       public class DES      {          ///           /// 加密字符串          ///           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;          }            ///           /// 解密字符串          ///           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://fpsra.baihongyu.com/

你可能感兴趣的文章
[官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
查看>>
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>
Disruptor-NET和内存栅栏
查看>>
Windows平台ipod touch/iphone等共享笔记本无线上网设置大全
查看>>
播放加密DVD
查看>>
产品设计体会(3013)项目的“敏捷沟通”实践
查看>>
RHEL6.3基本网络配置(1)ifconfig命令
查看>>
网络诊断工具之—路由追踪tracert命令
查看>>
Java模拟HTTP的Get和Post请求(增强)
查看>>