C# 静态变量与静态方法实例研究

程序如下:


代码如下:

public static string 英汉(string english,翻译结果 一个或多个)
{
string 英汉辞典 = Settings.Default.辞典所在目录+"haou_dict.xml";
try
{
if (File.Exists(英汉辞典))
{
XDocument dictionary = XDocument.Load(英汉辞典);
var query = from p in dictionary.Descendants("Name")
where p.Value.ToLower() == english.ToLower()
select p.Parent.Element("Content");
if (query.FirstOrDefault() == null)
{
return null;
}
else//可以翻译
{
if (一个或多个==翻译结果.多个)
{
return query.FirstOrDefault().Value.Trim();
}
else if (一个或多个 == 翻译结果.一个)
{
return 得到第一个汉字词(query.FirstOrDefault().Value);
}
throw new Exception("参数错误!");
}
}
else
{
throw new Exception("词典文件不存在!");
}
}
catch (Exception)
{
throw new Exception("词典文件出错!");
}
}

分析了一下,原因在于每次调用这个方法时都会去载入黄条处这个英汉辞典,如果执行2000次,就会载入2000次,自然速度慢,有没有什么办法在程序运行时只载入一次呢?想起在尚学堂看过的设计模式中有一个单例工厂模式,使用了静态变量,似乎能够解决,实例验证:
先定义一个类:


代码如下:

class 翻译{
public static XDocument 英汉辞典内容 = 英汉辞典初始化();
public XDocument 构造英汉辞典内容;
public 翻译()
{
构造英汉辞典内容 = 英汉辞典初始化();
}
public static XDocument 英汉辞典初始化()
{
if (File.Exists(英汉辞典文件))
{
return XDocument.Load(英汉辞典文件);
}
else
{
throw new Exception("英汉词典文件不存在!");
}
}
}

主程序:


代码如下:

var one = 翻译.英汉辞典内容;
var two = 翻译.英汉辞典内容;
if (one==two)
{
MessageBox.Show("相同");
}
else
{
MessageBox.Show("不同");
}
one = new 翻译().构造英汉辞典内容;
two = new 翻译().构造英汉辞典内容;
if (one == two)
{
MessageBox.Show("相同");
}
else
{
MessageBox.Show("不同");
}

结果:

分析如下:
无论是使用静态的翻译.英汉辞典内容,还是new 翻译().构造英汉辞典内容,他们都调用了 英汉辞典初始化() ,但是静态变量中的值只会初始化一次,后面每次访问,都是上次处理过的值,所以第一次显示的结果是相同,也就是说one,two的值其实是一个,第二个two访问的其实是第一次one初始化后的值;而使用类的构造函数来初始化变量每次都会重复初始化,自然其结果不同.
再比如(以下内容为转载):


代码如下:

class Program
{
static void Main(string[] args)
{//输出未经定义的静态变量,结果为0;也说明了,在C#中未赋初值的变量系统自动赋为0
Console.WriteLine(sort.i);
//静态变量的访问方法(类名.静态变量名),而且还可以在外部操作静态变量呢,可见静态变量并不神秘;
sort.i = 5;
//输出5
Console.WriteLine(sort.i);
//还可以通过构造函数对静态变量初值呢,呵
sort sortTest = new sort();
//输出构造函数中的赋值 3;
Console.WriteLine(sort.i);
}
}
class sort
{
public static int i;
public sort()
{
i = 3;
}
}

总结:在类内部访问静态变量时,直接用静态变量名即可,不用以(类名.静态变量名),这样的方式访问,
除了有静态变量之外,还有静态类实例,还有静态方法.但用法都是大同小异;
如:public static void myFun(){} //静态方法
private static Random MyRandom=new Random(); //静态类实例
之所以有时声明为私有静态变量,是为了让它只初始化一次.这样节省了内存空间
但又想让它在外部是不可访问的,这样利用私有这个访问限定符就搞定了.
私有静态:安全又节省空间.
例:如果想在每次实例化类的时间生成一组随机数,但产生随机数是要用到一个类的,即Random,这个类不是静态类,它要产生实例,用产生的实例来生成随机数,但如果在每次类实例化时都产生一个Random实例,那内存空间简直是极大的浪费,所以可以用:
private static Random MyRandom=new Random();
这样每次类实例化时,都会用同一个Random实例MyRandom来产生随机数

(0)

相关推荐

  • 理解C#编程中的静态类和静态成员以及密封类

    静态类 静态类与非静态类基本相同,但存在一个区别:静态类不能实例化.也就是说,不能使用 new 关键字创建静态类类型的变量.因为没有实例变量,所以要使用类名本身访问静态类的成员.例如,如果名为 UtilityClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调用该方法: UtilityClass.MethodA(); 对于只对输入参数进行运算而不获取或设置任何内部实例字段的方法集,静态类可以方便地用作这些方法集的容器.例如,在 .NET Framework 类库中,静

  • 解析C#中的私有构造函数和静态构造函数

    私有构造函数 私有构造函数是一种特殊的实例构造函数.它通常用在只包含静态成员的类中.如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例.例如: class NLog { // Private Constructor: private NLog() { } public static double e = Math.E; //2.71828... } 声明空构造函数可阻止自动生成默认构造函数.注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有

  • C#中static静态变量的用法实例

    本文实例讲述了C#中static静态变量的用法.分享给大家供大家参考.具体如下: 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析构函数或类以外的类型   静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: ① .该变量在全局数据区分配内存. ② .初始化:如果不显式初始化,那么将被隐式初始化为0.   静态局部变量 定义:在局部

  • C#静态变量与实例变量实例分析

    本文实例讲述了C#静态变量与实例变量的具体用法,分享给大家供大家参考.具体分析如下: 1)在语法定义上的区别: 类变量也叫静态变量,静态变量前要加static关键字,而实例变量前则不加: 实例变量也叫对象变量,即没加static 的变量: 2)在程序运行时的区别: 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量.静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态

  • 浅析C#静态类,静态构造函数,静态变量

    静态变量 静态变量位于栈上,它是一个全局变量,在编译期就已经生成. public class Cow { public static int count; private int id; public Cow() { id = ++count; } } 客户端创建2个Cow的实例,并打印静态变量count. static void Main(string[] args) { Console.WriteLine(Cow.count); Cow cow1 = new Cow(); Cow cow2

  • C#中的静态成员、静态方法、静态类介绍

    1.静态成员.实例成员 1.1定义及说明 数据成员: 静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问. 实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在. 函数成员: 静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量和静态方法:静态方法不可以直接访问实例变量和实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态

  • C# 静态构造函数使用总结

    •静态构造函数既没有访问修饰符,也没有参数. •如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数. •在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了. •如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行. •如果类中的静态字段带有初始化,则静态字段的初始化语句将在静态构造函数之前运

  • c#只读字段和常量的区别,以及静态构造函数的使用实例

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplication1{    /// <summary>    /// 作者:it小金    /// 功能:c#只读字段和常量的区别,以及静态构造函数的使用    /// </summary>    class Program    {        stat

  • C#静态构造函数用法实例分析

    本文实例讲述了C#静态构造函数用法.分享给大家供大家参考.具体如下: 当我们想初始化一些静态变量的时候,就需要用到静态构造函数了.这个静态构造函数属于类,而不属于实例,就是说这个构造函数只会被执行一次,即:在创建第一个实例或引用任何静态成员之前,由.NET自动调用. 现在碰到这样一个场景:提供一个静态方法,这个静态方法在不同的地方使用,涉及到一个参数值不同,而其他内容都完全一致.如果是将静态方法的内容复制出来做成另外一个方法,代码冗余太多,做法不可取.使用静态构造函数处理静态变量,则可以尽最大程

  • C#中静态构造函数的几点说明介绍

    静态构造函数是C#的一个新特性,其实好像很少用到.不过当我们想初始化一些静态变量的时候就需要用到它了.这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次.也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用. 复制代码 代码如下: class SimpleClass{// Static constructorstatic SimpleClass(){//}} 在使用静态构造函数的时候应该注意几点: 1.静态构造函数既没有访问修饰符,也没有参数.因为是.NE

随机推荐