日期:2014-05-18  浏览次数:20722 次

问个比较有意思的问题,关于静态参数!
程序里用到一些数组型参数,我以前把它作为静态变量来存储
如:
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 };}
  } 
  …… 
  }

大家看看,讨论一下,应该怎样改最好。

------解决方案--------------------
静态变量。我认为静态变量会在编译时存放在程序体内,运行时会加载到内存中。
即使是成员变量也无可避免地会编译到程序体中,也一样会加载到内存里,还损失一个实例化对象的内存。
------解决方案--------------------
没看明白,不过看在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;} 
}
……


------解决方案--------------------
怎么会浪费性能?
提高还有可能。
------解决方案--------------------
楼主,可先看看你的这30个数组,所占用的空间大不大(可根据"类型+值+数据"计算出来),如果占用的不是很多,如在1M以内,你就全定义成静态的就好,不用那么在晚那一点点内存资源(我们新建一个DataSet对象,也许吃掉的内存比你这一堆数组还多).

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


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

------解决方案--------------------
其实资源文件更适合楼主
------解决方案--------------------
静态变量占用内存多少可以估计出来么,如果与可用内存的比例很高导致系统需要频繁的在页面文件
和可用内存之间来回切换才算影响性能,否则就是提高性能,因为实例每次都要初始化也是占用cpu
时间的。
------解决方案--------------------
public class Top_Config 

public static string[] GETMMTypes()