vc#中没有全局变量怎么办?(100分)

  • 主题发起人 BlackHawk
  • 开始时间
B

BlackHawk

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个窗体下设置变量,在另一个窗体下要用到这个变量,由于vc#中没有全局变量这个
概念,那么我应该怎么做?谢谢!
 
在命名空间的后面定义!
 
和DELPHI一样,也要using
 
onlyonekgx说的也是个办法
你也可以写个函数
返回你要调用的值不就好了吗?
所需要的时候调用函数就OK啦:)
 
看来这个问题大家都不知道,我自己已经把它解决了:将变量的属性设为IsShared就ok了,
但是这道题的100分怎么办?
 
面向对象的思想
 
用Public 或 属性
前提是取得另一窗体的实例
 
处理全局的对象的思路。
从我写第一个应用起,我就有个习惯,喜欢定义两个全局变量
BOXTITLE: MessageBox的标题。
SYSTEMNAME: 系统名称。
这样就统一了界面显示的术语,老板一看,呵,到处都是公司名称,
心里高兴。他哪知道当我辞职后,把这两个变量一改,就和原公司无关了:)
所以用c#后,也必须沿用这种思路。我是这么解决的。
建立一个独立Assembly,其中填加一个类CONFIG.
Public class Config
{
public static string SYSTEMNAME;
public static string BOXTITLE;
static Config
{
SYSTEMNAME=“XXX管理系统”;
BOXTITLE=“XXX管理系统”;
}
}
就是说,一堆静态成员,加上一个静态构造函数。
这样,在使用所谓的全局变量时,直接把这个Assembly引用,并using 它的namespace。
This.Text=Config.SYSTEMNAME;
这样确实很方便,思路也很清晰。
可是有些缺点也出来了,
1.时间已长,这个Config类的静态成员越来越多,渐渐庞大起来。
2.在使用静态成员的代码中,到处充斥着Config.XXX,造成了我的类无法独立出来使用。
3.如果另一个独立的EXE assembly想使用Config中的设置时,却不得不把面对大量的
不需要的 已实例化的静态对象。

-----------------------------------------
基于这个原因,我有了第二个方案
使用Singleton模式,我曾经有段时间固执认为,我是面的实现也是Singleton :)
我专门有一个zframework 项目,把我写的和从网上下来的组件等,都堆集在里面了。其中有个命名空间
zframework.Program下面放着与一个应用框架相关的类。其中有个PM(ProgramManager)类,它是个Singleton。
PM负责,整个程序的异常,退出,信息显示等功能,当然也包括一个记录全局对象的功能。
Public class PM
{

private Hashtable m_VariableBag;

private PM()
{

m_VariableBag=new Hashtable();
}

//返回唯一的自己
public static PM Self
{
get
{
if(m_PM==null)
{
m_PM=new PM();
}
return m_PM;
}
}


//放变量
public void StoreVariable(string name,object variable)
{
m_VariableBag[name]=variable;
}
//取变量
public object FetchVaribale(string name)
{
return m_VariableBag[name];
}
}

赋值方式是:
using zframwork.Program
static void Main()
{
string boxtitle="xxx管理系统";
string systemname="xxx管理系统";

PM.Self.StoreVariable("BOXTITLE",boxtitle);
PM.Self.StoreVariable("SYSTEMNAME",systemname);

}
取值的方式
using zframwork.Program
public class MyForm:Form
{
string boxtitle=string.emtype;
string systemname=string.empty;
private void initialVarialbe()
{
boxtitle=PM.Selft.FetchVariable(“BOXTITLE”);
systemname=PM.Selft.FetchVariable(“SYSTEMNAME”);
}
}
这种方式,基本上解决了上面的三个问题,但是,有点不好的地方就是所谓的对象的Key --“BOXTITLE”,
是个字符串,有点Hard Code的嫌疑,实际使用中需要配以说明文档。
-----------------------------------------
ps:上面的boxtitlie和systemname完全可以作为pm的属性定义,只有那些与某个具体应用
有关的对象才用store方法存储。
 

用关键字static,Singleton也是用了static
 
HELP上有说.
 
先定义一个静态类,把全局变量作为类的成员(变量或者属性),进行封装,这样才符合面向对象的程序设计
 
用静态类,静态变量,接口(类实现该接口)都可以!
 
为什么要用全局对象呢?
 
为什么不将此变量定义为窗体类的一个属性呢?这才符合面向对象的设计呀。
 
>>看来这个问题大家都不知道,我自己已经把它解决了:将变量的属性设为IsShared就ok了,
好可笑,其实只有你一个人不知道。所有纯面向对象语言都是通过static(静态)装饰符处理全局变量,C#、Java、Smaltalk,没有例外。
 
以我浅薄的知识回答楼上各位高手们(俺不会DOTNET):
尊敬的各位,你们犯了面向对象的最大的概念错误,纯面向对象的语言中不存在全局变量一说法的,所有的只是类,一切都用类实现。
 
在OOP的系统里, 用全局对象的方法一般是建立一个Global类, 然后在这个类里定义静态的公用成员。这样也方便管理。如:
class Global
{
public static int giCount = 0;
public static string gsMessage = "Hello word".
}
调用时用 Global.giCount这样的形式。
可是,为什么要定义全局变量呢?
 
问题自己都解决了那大家就等着发分了
 
呵呵,有意思!
 
顶部