如果想访问某个类的方法或属性,一定要先实例化该类,然后用该类的对象加.号访问。比如:
有一个用户类和一个处理密码(加密和解密)的类。没生成一个用户实例后,处理密码类要对密码进行加密和解密。
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#编程语言中,"静态"(Static)是一个非常重要的关键字,它有着广泛的用途,涉及到类、方法、变量等多个方面。本篇文章将深入探讨C#中的静态概念及其应用。 首先,静态类(Static Class)是不能被实例化的,它们...
以下是C#基础知识的总结,涵盖了语言特性、关键字、数据类型、操作符、控制结构、函数、类和对象等方面: 语言特性 C#是一种静态类型、面向对象的编程语言。 C#支持结构化编程、面向对象编程和泛型编程。 C#支持...
本资源提供了C#基础知识的系统整理,对于期末考试有一定的帮助作用。下面是从给定的文件中生成的相关知识点: 第一章 1. C#应用程序可以使用除Word应用程序以外的工具和方法进行开发。 2. 命名空间可以签到。 3. ...
### C#基础知识系统汇总 #### 一、C#概述 C#是一种面向对象的编程语言,结合了C++的强大特性和Java的优雅风格,以及BASIC的易用性。它由微软开发,主要应用于Windows平台上的软件开发。C#不仅支持传统的桌面应用...
总的来说,C#数组是数据存储和处理的基础工具,了解并掌握数组的概念、操作和与其他C#特性的交互,是成为一名合格的C#程序员不可或缺的知识。通过不断学习和实践,我们可以构建更复杂、高效的程序。
本篇将详细阐述C#的基础知识,旨在为初学者提供全面的入门指导。 1. 引用类型与内存管理 C#中的引用类型包括String、数组、类、接口和委托。它们的内存分配在堆上,通过指针地址进行访问。引用类型的特点是安全性,...
适合人群:针对想要初步接触或巩固自己对C#基础知识掌握情况的学习者,特别适用于刚开始学习编程的学生或者是有一定经验但新接触到C#这门语言的开发者。 使用场景及目标:该资源用于个人自学或者课堂教学当中作为...
本篇文章将根据“c#基础知识个人总结”这一主题,深入探讨C#的基础知识,包括面向对象的概念、特性以及相关例题解析。 1. **C#基础语法** - 变量:C#中的数据类型分为值类型(如int、bool)和引用类型(如类、接口...
本文将深入探讨C#中的基础知识,特别是与基类Object相关的概念。Object是所有C#类的根,无论你创建何种类,它们最终都将继承自Object类。 1. **对象的概念**:在C#中,对象是类的实例。类是一种模板,定义了数据...
### C# 编程基础知识详解 #### 一、类型和变量 C# 是一种静态类型的语言,其中的数据类型被划分为两大类:**值类型** 和 **引用类型**。 ##### 值类型(ValueType) 值类型包括: - **简单类型(Simple Type)**...
C#基础知识概论涵盖了语言的基本元素、数据类型、控制结构、函数、类和对象等核心概念。 1. **基本语法与数据类型**: - C#语法与C++和Java类似,具有严格的类型检查。它支持多种数据类型,包括基本类型(如整型、...
以上只是C#基础知识的一部分,实际学习过程中,还需要了解更多的高级特性,如委托、事件、匿名方法、Lambda表达式、匿名类型、动态类型、扩展方法、元数据等。C#是一个不断发展和演进的语言,随着.NET Core的推出,...
### C#基础知识概论 #### 一、C#的产生——.NET基本概念简介 C#,作为一种由微软开发的编程语言,其诞生背景紧密关联于.NET框架的推出。.NET框架是微软针对Web Service解决方案的一项重大创新,旨在提供一个支持下...
1. **C#基础知识**: - 类型系统:C#是一种强类型语言,变量必须先声明类型再使用。 - 变量:包括基本类型(如int、float、bool等)和引用类型(如类、接口、数组等)。 - 控制结构:包括条件语句(if-else)、...
而`Inherit`和`AboutObject`可能涉及类继承和对象相关的内容,这些也是C#基础知识的重要部分。`Static`可能展示了静态类和静态成员的用法,`Collection`可能涉及C#集合框架,如数组、列表和字典等数据结构的使用。 ...
1. **C#基础**: - **变量与数据类型**:了解基本的数据类型如整型、浮点型、字符串以及引用类型,并理解变量的声明、赋值和作用域。 - **控制结构**:包括条件语句(if-else, switch)和循环(for, while, do-...
这个压缩包包含了一系列关于C#基础知识的文章和教程,涵盖了多个关键概念,包括委托、随机数、窗体间数据传递、命名空间、常用函数和方法,以及文件I/O操作。以下是这些知识点的详细说明: 1. **委托**:在C#中,...
C#是一种广泛应用于软件开发...通过学习这些文档和笔记,开发者可以建立起坚实的C#基础,理解类成员的核心概念,并进一步探索更复杂的C#特性和应用。在实际项目中,这些基础知识将有助于创建高效、可靠的软件解决方案。
以下是对标题和描述中涉及的一些C#基础知识的详细解释: 1. 静态变量与非静态变量的区别: 静态变量属于类,而非静态变量属于类的实例。静态变量在类加载时初始化,所有实例共享同一静态变量的值。而非静态变量在...
9. 构造函数:C# 支持静态构造函数和实例构造函数,Java 只有实例构造函数。10. 委托(Delegate)与事件:C# 中的委托类似于 Java 的函数式接口,但委托可以用于事件处理,Java 通过监听器模式实现事件。 在 C# 中...