关于ASP.NET中的静态变量问题?
我是用了“动软.NET代码生成器”生成的一系列简单三层架构代码(MODEL+DAL+BLL+WEB),我是要做一个小型企业网站,
我在Web层用到了大量静态变量,例如:网站的名称、域名、logo等等,在Web层中都封装到一个类的 静态属性 里去了,
我不知道这样做是否妥当!
请问,使用静态成员的坏处及静态成员在WebForm中和WinForm中有什么不同?谢谢了!
解决方案 »
- 如何把DropDownList控件中的中值和值的ID同时插入到数据库的表中
- .net 的 httpHandlers 和 httpModules 他们分别能干什么呢
- 如何让搜索引擎找到我网页来增加点击率
- ***发现导分的了,还是个星星呢,快来看看吧,我已经向版主举报了,就看版主是怎么办的了。
- 数据源控件中如何添加跟控件绑定的 is null 判断
- 急用:如何在asp.NET(C#)中调用C++Builder编写的DLL文件?在线等...
- 如何获取gridview自带的删除.所对应的键值
- 请教弱智问题关于DateTime datInput
- 项目无法创建也无法启动
- [日期转换]把150326转换成15:03怎么做???
- 列举几个大家在实际项目中用到的继承,多态(因为我不知道什么时候该用),或者设计模式,最好是实际的例子
- 图片的上一张 下一张功能的翻页的实现是如何进行的
using System.Collections.Generic;
using System.Web;using System.Text.RegularExpressions;namespace IdealWebSite
{
public class Company
{
private static IdealWebSite.BLL.Company _cm = new IdealWebSite.BLL.Company();
private static IdealWebSite.Model.Company _company = new IdealWebSite.Model.Company();
private static Regex _rx; static Company()
{
_company = _cm.GetModel(1);
} #region 属性
/// <summary>
/// 只读,获取公司编号
/// </summary>
public static int CompanyID
{
get { return _company.CompanyID; }
} /// <summary>
/// 地址
/// </summary>
public static string CompanyAddress
{
get { return _company.CompanyAddress; }
set { _company.CompanyAddress = value; }
} /// <summary>
/// 版权
/// </summary>
public static string ComCopyright
{
get { return _company.CompanyCopyright; }
set { _company.CompanyCopyright = value; }
} /// <summary>
/// 域名
/// </summary>
public static string CompanyDomain
{
get { return _company.CompanyDomain; }
set
{
_rx = new Regex(@"^([a-z0-9\-]{1,}\.)?[a-z0-9\-]{2,}\.([a-z0-9\-]{1,}\.)?[a-z0-9]{2,}$/i)");
if (_rx.Match(value).Success)
{
_company.CompanyDomain = value;
}
}
} /// <summary>
/// Fax
/// </summary>
public static string CompanyFax
{
get { return _company.CompanyFax; }
set { _company.CompanyFax = value; }
} /// <summary>
/// ICP
/// </summary>
public static string CompanyICP
{
get { return _company.CompanyICP; }
set { _company.CompanyICP = value; }
} /// <summary>
/// Logo
/// </summary>
public static string CompanyLogo
{
get { return _company.CompanyLogo; }
set { _company.CompanyLogo = value; }
} /// <summary>
/// Mail
/// </summary>
public static string CompanyMail
{
get { return _company.CompanyMail; }
set
{
_rx=new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* ");
if (_rx.Match(value).Success)
{
_company.CompanyMail = value;
}
}
} /// <summary>
/// Name
/// </summary>
public static string CompanyName
{
get { return _company.CompanyName; }
set { _company.CompanyName = value; }
} /// <summary>
/// Tel
/// </summary>
public static string CompanyTel
{
get { return _company.CompanyTel; }
set
{
_rx = new Regex(@"(\d+-)?(\d{4}-?\d{7}|\d{3}-?\d{8}|^\d{7,8})(-\d+)?");
if (_rx.Match(value).Success)
{
_company.CompanyTel = value;
}
}
}
#endregion #region 方法
/// <summary>
/// 更新到数据库
/// </summary>
public static void Update()
{
_cm.Update(_company);
}
#endregion
}
}
静态变量最大的问题应该就是内存释放的问题,这个问题在大型的项目中尤为明显,而且一般情况下都是不被察觉的情况下被滥用。
比如:一个静态变量隐式的引用了this,这种情况下可能会导致this不会被释放,this可能是一个page也可能是一个其他对象,这将导致连锁反映,所有和this有引用关系的对象都会被Hold住,在垃圾回收的时候这些对象将不会被释放。
静态属性没有任何问题,静态方法也没有,这些属性和方法是在类型对应的方法表中。但是静态变量也不是不能使用,只是使用的时候要格外的小心,其方便性不言而喻。WebForm和WinForm里面静态变量的内存布局是一样的(都在托管堆上),所以他们没有本质的区别,只是应用的场景不同而已。分析你的例子:private static IdealWebSite.BLL.Company _cm = new IdealWebSite.BLL.Company();
private static IdealWebSite.Model.Company _company = new IdealWebSite.Model.Company();
private static Regex _rx;
这些将对象是根,不会被释放,如果你的程序中有引用这些对象的地方要格外小心。
private static IdealWebSite.BLL.Company _cm = new IdealWebSite.BLL.Company();
private static IdealWebSite.Model.Company _company = new IdealWebSite.Model.Company();
private static Regex _rx;
声明为private就是不让类外部引用!
汗 LZ 自己对基础知识 认识不深
静态变量的 认识 要从CLR开始 首先CLR会给默认的 类成员赋值 比如 int i; i默认=0
但是 静态变量 也是 在 第一个 实例出现之前赋值的,而且 只会赋值一次 .他不输入 实例成员
属于类成员 ,所以 可以直接 通过 类.变量 来访问 ,避免了其他语言中的 全局变量
静态变量的好处 就在于 他仍然 输入 类,作用域 还是在类中,一旦他的被引用的 成员全部没有引用了 就被CLR 回收了
这样的话 ,申明 static 比如网站名,对于 这些不要求 线程安全的 变量 直接 申请就好了
很是感谢!那么说我这样做是可行的,不过要小心使用了?
这个代码放在IIS上运行的话,静态成员是在第一个用户访问后一直存在还是??
一直存在,直到应用程序结束
谢谢SP1234,cuike519,wuyq11谢谢三位星星!@SP1234,喜欢你回答问题的风格!技术狂人!佩服!