文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>NET也不能忽略基础

NET也不能忽略基础

时间:2011-05-08  来源:陈晨

      有时候,我们项目做多了,尤其是网站项目做多了,就会觉得基础知识好像没多大用,但殊不知,对一些基础概念理解不深,就会带来问题。整理下项目中因为基础概念理解不深造成的问题,希望能给以启发。

      1.引用类型存储问题

      我们知道引用类型存储在堆中,将一个引用类型赋值给另外一个引用类型时,两者指向的是同一个对象,对任何一个变量的修改都会影响到另外一个变量的值。如果单拿这句话或者是应对面试中的题目,大家理解都没问题。但落实到具体项目中,加上一些复杂的逻辑,如果对这话理解不深,就会造成一些问题。下面是项目中犯错的一个真实案例。

引用类型赋值修改问题
    static void Main(string[] args)
{
RefTypeCache rtc
= new RefTypeCache();
rtc.ShowDatas(
"B");
rtc.ShowDatas(
"A");
rtc.ShowDatas(
"B");

Console.Read();
}

public class RefTypeCache
{
/// <summary>
/// 不同类型用户操作数据
/// </summary>
public void ShowDatas(string userType)
{
DataTable dt
= this.GetUserData();
//A类用户想显示下用户积分,就在新赋值的dt中加了一列积分列
if (userType == "A")
{
dt.Columns.Add(
"score");
Console.WriteLine(
"A类用户获取到的数据中有积分列:" + dt.Columns.Contains("score"));
}
//B类用户直接显示就好了,不加积分列
if (userType == "B")
{
Console.WriteLine(
"B类用户获取到的数据中有积分列:" + dt.Columns.Contains("score"));
}
}

/// <summary>
/// 获取数据
/// </summary>
private DataTable GetUserData()
{
DataTable dt
= null;
System.Web.Caching.Cache cache
= System.Web.HttpRuntime.Cache;
string cacheName = "alldata";
object o = cache.Get(cacheName);
//有缓存则从缓存种获取
if (o != null)
{
dt
= o as DataTable;
}
//无缓存则初始化数据
if(dt == null)
{
dt
= new DataTable();
dt.Columns.Add(
"id");
dt.Columns.Add(
"datas");
DataRow dr0
= dt.NewRow();
dr0[
"id"] = "1";
dr0[
"datas"] = "张三";
dt.Rows.Add(dr0);
DataRow dr1
= dt.NewRow();
dr1[
"id"] = "2";
dr1[
"datas"] = "李四";
dt.Rows.Add(dr1);
DataRow dr2
= dt.NewRow();
dr2[
"id"] = "3";
dr2[
"datas"] = "赵六";
dt.Rows.Add(dr2);
cache[cacheName]
= dt;
}

return dt;
}
}

      从上面的例子可以看出,缓存中的对象赋值给其他变量后,对赋值变量做了修改,从而改变了缓存对象的值,造成了程序的异常。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载