C# 静态变量与静态方法实例研究
发布时间:2023-04-23 04:26:00
程序如下:
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来产生随机数


猜你喜欢
- 记录自己用java swing做的第一个简易界面。LoginAction.javapackage com.QQUI0819;import j
- eclipse汉化包我们会经常用到,因为它可以帮助英语基础差的用户更快的掌握这个软件,非常方便,但是我看了下整个互联网上并没有对这个汉化包进
- 前言本文,将介绍如何通过Java后端程序代码在PDF中创建工具提示。添加工具提示后,当鼠标悬停在页面上的元素时,将显示工具提示内容。导入ja
- Android 中启动自己另一个程序的activity如何实现可以使用action,举例: 1. 比如建立activity4,我
- 本文是在我的文章android图片处理,让图片变成圆形 的基础上继续写的,可以去看看,直接看也没关系,也能看懂 1、首先在res文
- 一、Nuget安装log4net --> Install-Package log4net二、在AssemblyInfo.cs文件中添加
- main方法调用spring的service将业务层类配置到Spring中:<bean id="customerServic
- 效果 使用compile 'site.gemus:openingstartanimation:1.0.0' //在gra
- 本文实例讲述了C#实现跨线程操作控件方法,分享给大家供大家参考。具体实现方法如下:由于在.net平台下Winform、wpf禁止跨线程直接访
- 本文实例讲述了C#执行外部命令的方法。分享给大家供大家参考。具体实现方法如下:///<summary>///executes a
- 上一节我们做好了支付页面的显示,从上一节支
- 1、在Anaylze中选择Run Inspection by Name...2、在点击之后弹出的窗口输入unusedresources后,回
- 正式版:版本最新但只有14天的体验时间,之后需要激活,激活注册已经不行了,现在需要使用新的方式:首先下载反向代理工具,下载地址:根据系统选择
- 这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。1.背景自适应且不失真问题的存在制作自适应背景图
- 本文实例介绍了sdcard存储图片下载简单操作,分享给大家供大家参考,具体内容如下步骤 -- 在配置清单添加完联网权限后1、res/layo
- java中的方法重载和方法重写有很多区别。 下面给出了方法重载和方法覆盖之间的差异列表:编号方法重载方法重写1方法重载用于提高程序的可读性。
- 什么是“异步调用”?“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行
- 本文实例为大家分享了java实现计算器功能具体代码,供大家参考,具体内容如下效果图组成结构从结构上来说,一个简单的图形界面,需要由界面组件、
- 本文以实例形式简单讲述了C#观察者模式,分享给大家供大家参考。具体实现方法如下:现在假设有一个软件公司,每当有新产品推出,就把信息通知到一些
- 现在,让我们找出“如何学习 Java 编程”的答案。通过承认您是初学者这一事实开始您的学习之旅很重要