问个比较有意思的问题,关于静态参数!

神奇的章鱼哥 2007-11-22 10:00:45
程序里用到一些数组型参数,我以前把它作为静态变量来存储
如:
using System;
using System.Collections.Generic;
using System.Text;

namespace TSOZ.E.Base
{
public class Top_Config
{
public static string[] MMTypes = new string[] { "A", "B", "C", "D" };
public static string[] YdLxs = new string[] {"X","Y","Z"};
public static bool[] DWOpt = new bool[] { true,false,false };
……
}
}

别的类里用Top_Config.MMTypes来调用

可是问题来了,这些数组大概有30多个,而且很多可能就在某个功能里使用,是属于不常用的。但是这些不常用的参数我也不想把他放到某个窗体类里,我统一把参数放在Top_Config里比较清晰,维护和本地化时也比较方便。

那样这样的话,是不是性能受影响了?毕竟这些参数很多就一个功能窗口用到。

我现在想改一下,把常用的参数作为静态变量,不常用的用实力化的属性来做

如:
public class Top_Config
{
public static string[] MMTypes = new string[] { "A", "B", "C", "D" };
public static string[] YdLxs = new string[] {"X","Y","Z"};

public bool[] DWOpt
{
get {return new bool[] { true,false,false };}
}
……
}

大家看看,讨论一下,应该怎样改最好。
...全文
212 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wisdomqq 2007-11-22
  • 打赏
  • 举报
回复
其实资源文件更适合楼主
九章落地 2007-11-22
  • 打赏
  • 举报
回复
楼主,可先看看你的这30个数组,所占用的空间大不大(可根据"类型+值+数据"计算出来),如果占用的不是很多,如在1M以内,你就全定义成静态的就好,不用那么在晚那一点点内存资源(我们新建一个DataSet对象,也许吃掉的内存比你这一堆数组还多).

如果有很多数组不常用,是可以定义成属性,但应该是静态属性,无所实例化,如:
public static bool[] DWOpt
{
get {return new bool[] { true,false,false };}
}
调用的时候这样:Top_Config.DWOpt....
虽然属情是静态,但值是动态,所以初始化类时,只保存属性的地址,应该可节省空间.


从维护的角度来讲,其实放在外部更合理,如放在应用程序的config文件或xml或直接存到数据库里,这样维护起来方便些.例如:哪一天,客户想把"库存报表",改成"我的库存统计报表",直接修改外部文件即可.当然,我只是举例,不一定合乎楼主的需求.

神奇的章鱼哥 2007-11-22
  • 打赏
  • 举报
回复
danjiewu,你好,怎么会提高性能呢,能不能详细说说
很多这样的参数全程占用内存,会提高性能吗?
神奇的章鱼哥 2007-11-22
  • 打赏
  • 举报
回复
可以肯定一点,这些参数与实例无关
原则上完全可以用静态变量
但是考虑到这样的参数很多,但大部分只用到一个地方,这样的话用静态变量会不会浪费性能
用属性的话我可以
Top_Config tc=new Top_Config();
tc.DWOpt
使用一次以后,他就销毁内存了
danjiewu 2007-11-22
  • 打赏
  • 举报
回复
怎么会浪费性能?
提高还有可能。
神奇的章鱼哥 2007-11-22
  • 打赏
  • 举报
回复
楼上的没有明白我的意思,可能我没说清楚,这些参数是定死的,不会变
这些参数肯定与实例无关,我把这些参数放在一个类里是为了维护起来方便,就是考虑很多这样的参数用的地方不多,都用静态的话会不会浪费性能,毕竟都要全过程占用内存或堆栈

不存在张三的手提包和李四的手提包之说,因为都是一样的

很简单的例子:几个报表名称,我现在叫

public static string[] CKRPTs = new string[] {"库存报表","收发存汇总表","出入库统计","库存台帐","库存流水帐","移动分布图"};

这个参数只有在设置用户权限的时候用到,别的地方都没用到
sxlfybb 2007-11-22
  • 打赏
  • 举报
回复
没看明白,不过看在100分的份上就说一下吧.
静态变量和实例化其实就是面向对象而已.

比如有一类动物叫人,每个人都有手和脚.这个人就是Top_Config ,手和脚就是MMTypes和YdLxs
其中,人类中有个人叫张三,张三有个手提包. 那你new Top_Config(),特定一个属性标识为张三.DWOpt就是那个手提包了.

说到底,不管你采用静态还是非静态的变量(属性)来存储数据.从性能角度来考虑的话,应该差别不大.

另外,楼主最后举的那个例子,实在是...
你可以这么写

public class Top_Config
{
public static string[] MMTypes = new string[] { "A ", "B ", "C ", "D " };
public static string[] YdLxs = new string[] { "X ", "Y ", "Z "};
public bool[] dwopt ;

public bool[] DWOpt
{
get {return this.dwopt;}
set {this.dwopt=value;}
}
……
}
heguo 2007-11-22
  • 打赏
  • 举报
回复
静态变量。我认为静态变量会在编译时存放在程序体内,运行时会加载到内存中。
即使是成员变量也无可避免地会编译到程序体中,也一样会加载到内存里,还损失一个实例化对象的内存。
huming_h 2007-11-22
  • 打赏
  • 举报
回复
神奇的章鱼哥 2007-11-22
  • 打赏
  • 举报
回复
谢谢nairenxunwei,这些变量都是只读的
nairenxunwei 2007-11-22
  • 打赏
  • 举报
回复
静态变量不是这么用的, 是有很多隐患的, 比如线程安全。
如果你的变量值是只读的, 应该用static readonly, 这个是线程安全的
如果你的变量值不是只读的,不能这么用,静态变量是在运行期第一次调用的时候生成的。 要考虑线程安全, 比如, 同时多个线程同1时第一次访问某个静态变量,在内存中就有2个这样的变量了。 当然, 如果你静态的变量做只读用,也没太多多线程, 那么也没什么所谓了。
nairenxunwei 2007-11-22
  • 打赏
  • 举报
回复
静态变量不是这么用的, 是有很多隐患的, 比如线程安全。
如果你的变量值是只读的, 应该用static readonly, 这个是线程安全的
如果你的变量值不是只读的,不能这么用,静态变量是在运行期第一次调用的时候生成的。 要考虑线程安全, 比如, 同时多个线程同1时第一次访问某个静态变量,在内存中就有2个这样的变量了。 当然, 如果你静态的变量做只读用,也没太多多线程, 那么也没什么所谓了。
plmsoft 2007-11-22
  • 打赏
  • 举报
回复
public class Top_Config
{
public static string[] GETMMTypes()
{
return new string[] { "A ", "B ", "C ", "D " };

}
}
这样是不是好些
「已注销」 2007-11-22
  • 打赏
  • 举报
回复
静态变量占用内存多少可以估计出来么,如果与可用内存的比例很高导致系统需要频繁的在页面文件
和可用内存之间来回切换才算影响性能,否则就是提高性能,因为实例每次都要初始化也是占用cpu
时间的。
神奇的章鱼哥 2007-11-22
  • 打赏
  • 举报
回复
资源文件怎么存放数组?
请教

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧