摘要: 本文档主要介绍.NET开发中两项新技术,.NET平台语言中的语言集成查询技术 - LINQ,与ADO.NET中新增的数据访问层设计技术ADO.NET Entity Framework。ADO.NET的LINQ to Entity部分以LINQ为基础,为了完整性本文档首先介绍LINQ技术。 预备知识 LINQ技术 LINQ是.NET 3.5中新增的一种技术,这个技术扩展了.NET平台上的编程语言,使...  阅读全文
posted @ 2010-03-16 15:37 leeolevis 阅读(62) | 评论(0) |  编辑

配置文件

<appSettings>
  
<add key="EnableCache" value="true"/>
  
<add key="CacheDurationSeconds" value="300"/>
</appSettings>

操作方法

代码
using System;
using System.Web.Configuration;

public class SiteHelper
{
    
static public object GetCache(string CacheId)
    {
        
object objCache = System.Web.HttpRuntime.Cache.Get(CacheId);

        
// 判斷 Cache 是否啟用
        if (WebConfigurationManager.AppSettings["EnableCache"== null
            
|| !Convert.ToBoolean(WebConfigurationManager.AppSettings["EnableCache"]))
        {
            objCache 
= null;
            System.Web.HttpRuntime.Cache.Remove(CacheId);
        }

        
return objCache;
    }

    
/// <summary>
    
/// 寫入 Cache 資料 ( 預設 60 秒 )
    
/// </summary>
    
/// <param name="CacheId"></param>
    
/// <param name="objCache"></param>
    static public void SetCache(string CacheId, object objCache)
    {
        
if (WebConfigurationManager.AppSettings["CacheDurationSeconds"!= null)
        {
            SetCache(CacheId, objCache, 
                Convert.ToInt32(WebConfigurationManager.AppSettings[
"CacheDurationSeconds"]));
        }
        
else
        {
            SetCache(CacheId, objCache, 
60);
        }
    }

    
static public void SetCache(string CacheId, object objCache, int cacheDurationSeconds)
    {
        
if (objCache != null)
        {
            System.Web.HttpRuntime.Cache.Insert(
                CacheId,
                objCache,
                
null,
                System.Web.Caching.Cache.NoAbsoluteExpiration,
                
new TimeSpan(00, cacheDurationSeconds),
                System.Web.Caching.CacheItemPriority.High,
                
null);
        }
    }
}

使用方法

代码
string strCache1 = SiteHelper.GetCache("Cache1"as string;

if (strCache1 == null)
{
    Response.Write(
"<p>Cache is empty</p>");

    strCache1 
= "OK";
    SiteHelper.SetCache(
"Cache1", strCache1, 30);
}

Response.Write(strCache1);

 常见问题#Cache显示与清空问题

代码
List<string> cacheKeys = new List<string>();
IDictionaryEnumerator cacheEnum 
= Cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
    cacheKeys.Add(cacheEnum.Key.ToString());
}
foreach (string cacheKey in cacheKeys)
{
    Cache.Remove(cacheKey);
}
代码
    //清除所有缓存
    protected void RemoveAllCache()
    {
        System.Web.Caching.Cache _cache 
= HttpRuntime.Cache;
        IDictionaryEnumerator CacheEnum 
= _cache.GetEnumerator();
        ArrayList al 
= new ArrayList();
        
while (CacheEnum.MoveNext())
        {
            al.Add(CacheEnum.Key);
        }
        
foreach (string key in al)
        {
            _cache.Remove(key);
        }
        show();
    }
    
//显示所有缓存 
    void show()
    {
        
string str = "";
        IDictionaryEnumerator CacheEnum 
= HttpRuntime.Cache.GetEnumerator();

        
while (CacheEnum.MoveNext())
        {
            str 
+= "缓存名<b>[" + CacheEnum.Key + "]</b><br />";
        }
        
this.Label1.Text = "当前网站总缓存数:" + HttpRuntime.Cache.Count + "<br />" + str;
    }

添加到扩展方法

代码
using System;
using System.Web.Caching;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// 擴充 System.Web.Caching 命名空間的 Extension Methods
/// </summary>
static public class CacheExtensionMethod
{
    
public static void Clear(this Cache x)
    {
        List
<string> cacheKeys = new List<string>();
        IDictionaryEnumerator cacheEnum 
= x.GetEnumerator();
        
while (cacheEnum.MoveNext())
        {
            cacheKeys.Add(cacheEnum.Key.ToString());
        }
        
foreach (string cacheKey in cacheKeys)
        {
            x.Remove(cacheKey);
        }
    }
}

MSDN

C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。因此,建议使用 foreach,而不直接操作枚举数。

枚举数可用于读取集合中的数据,但不能用于修改基础集合。

最初,枚举数定位在集合中第一个元素前。Reset 方法还会将枚举数返回到此位置。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。

在调用 MoveNextReset 之前,Current 返回同一个对象。MoveNextCurrent 设置为下一个元素。

如果 MoveNext 越过集合的末尾,则枚举数将放置在集合中最后一个元素的后面,而且 MoveNext 返回 false。当枚举数位于此位置时,对 MoveNext 的后续调用也返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext

只要该集合保持不变,枚举数也就保持有效。如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 MoveNextReset 的调用将引发 InvalidOperationException。如果在 MoveNextCurrent 之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。

枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。

 

大中型Cache应用推荐:Velocity,memcached等

posted @ 2010-02-02 22:57 leeolevis 阅读(14) | 评论(0) |  编辑

 代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="JqueryAjaxLongPoll.aspx.cs" Inherits="JqueryAjaxLongPoll" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>
    
<script type="text/javascript" src="script/jquery-1.2.6.js"></script>
    
<script type="text/javascript">
        $(document).ready(
function(){
            $(
"#Button1").bind("click",{btn:$("#Button1")},function(evdata){
                $.ajax({
                    type:
"POST",
                    http:
//hi.baidu.com/fc/editor/%22JqueryAjaxLongPoll.aspx",
                    dataType:"json",
                    timeout:
10000,
                    data:{ajax:
"1",time:"10000"},
                    success:
function(data,textStatus){
                            
//alert("ok!");
                            evdata.data.btn.click();
                    },
                    complete:
function(XMLHttpRequest,textStatus){
                            
if(XMLHttpRequest.readyState=="4"){
                                alert(XMLHttpRequest.responseText);
                            }
                    },
                    error: 
function(XMLHttpRequest,textStatus,errorThrown){
                            
//$("#ajaxMessage").text($(this).text()+" out!")
                            alert("error:"+textStatus);
                            
if(textStatus=="timeout")
                                evdata.data.btn.click();
                    }
                });
            });

            
/*$("#ajaxMessage").ajaxStart(function(){
                $(this).text("准备建立请求.readyState0:");
            });
            $("#ajaxMessage").ajaxSend(function(evt, request, settings){
                $(this).text("开始请求,准备发送数据.readyState1:"+request.readyState);
            });
            $("#ajaxMessage").ajaxComplete(function(event,request, settings){
                if(request.status==200)
                    $(this).text("请求完成.readyState4:"+request.readyState);
            });
            $("#ajaxMessage").ajaxStop(function(){
                $(this).text("请求结束.");
            });
*/
        });
    
</script>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
<input id="Button1" type="button" value="AjaxLongPoll" />
        
<label id="ajaxMessage"></label>
    
</div>
    
</form>
</body>
</html>
代码
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;

public partial class JqueryAjaxLongPoll : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
if (Request.Form["ajax"== "1")
        {
            
//Response.End();
            int time = Convert.ToInt32(Request.Form["time"]);
            DateTime date1 
= DateTime.Now.AddMilliseconds((double)time);
            
bool ready = false;
            
while (Response.IsClientConnected)
            {
                Thread.Sleep(
3000);
                
if (DateTime.Compare(date1, DateTime.Now) < 0)
                {
                    Response.End();
                    
break;
                }
                
//ready = true;
                if (ready)
                {
                    Response.Write(
"SetValue('" + DateTime.Now.ToString() + "')");
                    
//Response.Flush();
                    Response.End();
                    
break;
                }
                
else
                {

                }
            }
        }
        
else
        {
            
if (!Page.IsPostBack)
            {

            }
        }
    }
}

对代码的说明:利用jquery,很方便的就能实现ajax,上面设置了ajax的timeout时间,由于设置了timeout将会造成不能保持长连接,到了时间ajax自动会报“超时”的错误,也就是会调用error方法,此时textStatus=="timeout",timeout后重新进行ajax请求。服务器接受ajax请求的时候,会接收一个超时时间的值,超时的情况下服务器端的处理也立即停止。当客户端成功获取返回结果时,也会立即进行新的ajax请求,如此循环。

为什么要设置客户端的ajax超时值呢?因为服务器为了保持请求(阻塞请求),必须有一个无限循环,循环的结束条件就是获取到了返回结果,如果客户端关闭了(客户端浏览器的关闭不会发消息给服务器),服务器无法知道客户端已经关了,这个请求没必要处理下去了。最终会造成资源过度浪费,只要用一个折中的办法,限制超时时间。

可以不必设置客户端ajax的超时时间,但进行请求的时候传递一个超时值给服务器,服务器在处理的时候,如果超时时间到了的话,还没有客户端需要的结果,这时传递一个超时信息给客户端,客户端接收到了此信息,根据情况重新进行ajax请求。XMLHttpRequest没有超时的参数,Jquery用window.setTimeout自己封装的(到了定时时间运行超时处理方法,和XMLHttpRequest结束方法)。可以根据这个思路来改变一下,IBM上介绍的LONG POLL好像也是这样的。

代码
$(document).ready(function(){
            $(
"#Button1").bind("click",{btn:$("#Button1")},function(evdata){
                $.ajax({
                    type:
"POST",
                    http:
//hi.baidu.com/fc/editor/%22JqueryAjaxLongPoll.aspx",
                    dataType:"json",
                    data:{ajax:
"1",time:"6000000"},
                    success:
function(data,textStatus){
                            
//成功
                            if(data.success=="1"){
                                
//客户端处理
                                //...
                                ///重新请求
                                evdata.data.btn.click();
                            }
                            
//超时
                            if(data.success=="0"){
                                evdata.data.btn.click();
                            }
                    },
                    complete:
function(XMLHttpRequest,textStatus){
                            
if(XMLHttpRequest.readyState=="4"){
                                alert(XMLHttpRequest.responseText);
                            }
                    },
                    error: 
function(XMLHttpRequest,textStatus,errorThrown){
                            
//$("#ajaxMessage").text($(this).text()+" out!")
//
                            alert("error:"+textStatus);
//
                            if(textStatus=="timeout")
                                evdata.data.btn.click();
                    }
                });
            });

 
后台代码变更后:
代码
if (Request.Form["ajax"== "1")
        {
            
int time = Convert.ToInt32(Request.Form["time"]);
            DateTime date1 
= DateTime.Now.AddMilliseconds((double)time);
            
bool ready = false;
            
while (Response.IsClientConnected)
            {
                Thread.Sleep(
3000);
                
if (DateTime.Compare(date1, DateTime.Now) < 0)
                {
                    Response.Write(
"{success:'0'}");
                    Response.End();
                    
break;
                }
                
//此处进行请求处理,有结果了置ready = true
                
//ready = true;
                if (ready)
                {
                    Response.Write(
"{success:'1'}");
                    Response.End();
                    
break;
                }
            }
        }
        
else
        {
            
if (!Page.IsPostBack)
            {
            }
        }

上面的方法应该就可以满足要求了,具体的超时时间可以根据情况来设置。这也是根据IBM上介绍的“server push”思路,来实现了其中的一种。

如果你有更友好更简洁的解决方案,欢迎分享

posted @ 2010-01-23 14:54 leeolevis 阅读(8) | 评论(0) |  编辑

算术函数

abs(X)

返回给定数字表达式的绝对值。

max(X,Y[,...])

返回表达式的最大值。

min(X,Y[,...])

返回表达式的最小值。

random(*)

返回随机数。

round(X[,Y])

返回数字表达式并四舍五入为指定的长度或精度。

字符处理函数

length(X)

返回给定字符串表达式的字符个数。

lower(X)

将大写字符数据转换为小写字符数据后返回字符表达式。

upper(X)

返回将小写字符数据转换为大写的字符表达式。

substr(X,Y,Z)

返回表达式的一部分。

randstr()

quote(A)

like(A,B)

确定给定的字符串是否与指定的模式匹配。

glob(A,B)

条件判断函数

coalesce(X,Y[,...])

ifnull(X,Y)

nullif(X,Y)

集合函数

avg(X)

返回组中值的平均值。

count(X)

返回组中项目的数量。

max(X)

返回组中值的最大值。

min(X)

返回组中值的最小值。

sum(X)

返回表达式中所有值的和。

其他函数

typeof(X)

返回数据的类型。

last_insert_rowid()

返回最后插入的数据的 ID

sqlite_version(*)

返回 SQLite 的版本。

change_count()

返回受上一语句影响的行数。

last_statement_change_count()


oh,还有就是看到有人说,好像成批插入的时候,启动事务,比不启动事务快n倍
还有就是尽量使用参数化的SQL,估计和商用DB一样能够自动Prepare.

===========

sqlite可以在shell/dos command底下直接执行命令:

sqlite3 film.db "select * from film;"

输出 HTML 表格:

sqlite3 -html film.db "select * from film;"

将数据库「倒出来」:

sqlite3 film.db ".dump" > output.sql

利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):

sqlite3 film.db < output.sql

在大量插入资料时,你可能会需要先打这个指令:

begin;

插入完资料后要记得打这个指令,资料才会写进数据库中:

commit;

 

 

 

SQLITE分页

刚开始的时候没注意语法
后来才发现,原来用SQLite分页是世界上最简单的。
如果我要去11-20的Account表的数据
Select * From Account Limit 9 Offset 10;
以上语句表示从Account表获取数据,跳过10行,取9行

嗯,我觉得这个特性足够让很多的web中型网站使用这个了。

也可以这样写 select * from account limit10,9和上面的的效果一样。
这种写法MySQL也支持。

SQLite不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化:

易于管理
易于使用
易于嵌入其他大型程序
易于维护和配置
许多人喜欢SQLite因为它的小巧和快速. 但是这些特性只是它的部分优点, 使用者还会发现SQLite是非常稳定的. 出色的稳定性源于它的简单, 越简单就越不容易出错. 除了上述的简单、小巧和稳定性外, 最重要的在于SQLite力争做到简单化.

简单化在一个数据库引擎中可以说是一个优点, 但也可能是个缺点, 主要决定于你想要做什么. 为了达到简单化, SQLite省略了一些人们认为比较有用的特性, 例如高并发性、严格的存取控制、 丰富的内置功能、 存储过程、复杂的SQL语言特性、 XML以及Java的扩展, 超大的万亿级别的数据测量等等. 如果你需要使用上述的这些特性并且不介意它们的复杂性, 那么SQLite也许就不适合你了. SQLite没有打算作为一个企业级的数据库引擎, 也并不打算和Oracle或者PostgreSQL竞争.

仅凭经验来说SQLite适用于以下场合: 当你更看中简单的管理、使用和维护数据库, 而不是那些企业级数据库提供的不计其数的复杂功能的时候,使用SQLite是一个比较明智的选择. 事实也证明, 人们在许多情况下已经清楚的认识到简单就是最好的选择.

SQLite最佳试用场合
网站

作为数据库引擎SQLite适用于中小规模流量的网站(也就是说, 99.9%的网站). SQLite可以处理多少网站流量在于网站的数据库有多大的压力. 通常来说, 如果一个网站的点击率少于100000次/天的话, SQLite是可以正常运行的. 100000次/天是一个保守的估计, 不是一个准确的上限. 事实证明, 即使是10倍的上述流量的情况下SQLite依然可以正常运行.

嵌入式设备和应用软件

因为SQLite数据库几乎不需要管理, 因此对于那些无人值守运行或无人工技术支持的设备或服务, SQLite是一个很好的选择. SQLite能很好的适用于手机, PDA, 机顶盒, 以及其他仪器. 作为一个嵌入式数据库它也能够很好的应用于客户端程序.

应用程序文件格式

SQLite作为桌面应用程序的本地磁盘文件格式取得了巨大成功.例如金融分析工具、CAD 包、档案管理程序等等. 一般的数据库打开操作需要调用sqlite3_open()函数,并且标记一个显式本地事务的起始点(BEGIN TRANSACTION)来保证以独占的方式得到文件的内容. 文件保存将执行一个提交(COMMIT)同时标记另一个显式本地事务起始点. 这种事务处理的作用就是保证对于应用程序数据文件的更新是原子的、持久的、独立的和一致的.

数据库里可以加入一些临时的触发器,用来把所有的改变记录在一张临时的取消/重做日志表中. 当用户按下取消/重做按钮的时候这些改变将可以被回滚. 应用这项技术实现一个无限级的取消/重做功能只需要编写很少的代码.

替代某些特别的文件格式

许多程序使用fopen(), fread(), 或 fwrite()函数创建和管理一些自定义的文件用来保存数据. 使用SQLite替代这些自定义的文件格式将是一种很好的选择.

内部的或临时的数据库

对于那些有大量的数据需要用不同的方式筛选分类的程序, 相对于编写同样功能的代码, 如果你把数据读入一个内存中的SQLite数据库, 然后使用连接查询和ORDER BY子句按一定的顺序和排列提取需要的数据, 通常会更简单和快速. 按照上述的方法使用内嵌的SQLite数据库将会使程序更富有灵活性, 因为添加新的列或索引不用重写任何查询语句.

命令行数据集分析工具

有经验的SQL用户可以使用SQLite命令行程序去分析各种混杂的数据集. 原是数据可以从CSV(逗号分隔值文件)文件中导入, 然后被切分产生无数的综合数据报告. 可能得用法包括网站日志分析, 运动统计分析, 编辑规划标准, 分析试验结果.

当然你也可以用企业级的客户端/服务器数据库来做同样的事情. 在这种情况下使用SQLite的好处是: SQLite的部署更为简单并且结果数据库是一个单独的文件, 你可以把它存储在软盘或者优盘或者直接通过email发给同事.

在Demo或测试版的时候作为企业级数据库的替代品

如果你正在编写一个使用企业级数据库引擎的客户端程序, 使用一个允许你连接不同SQL数据库引擎的通用型数据库后台将是很有意义的. 其更大的意义在于将SQLite数据库引擎静态的连接到客户端程序当中,从而内嵌SQLite作为混合的数据库支持. 这样客户端程序就可以使用SQLite数据库文件做独立的测试或者验证.

本文来自: (www.91linux.com) 详细出处参考:http://www.91linux.com/html/article/database/sqlite/200812/12-14611.html

数据库教学

因为SQLite的安装和使用非常的简单(安装过程几乎忽略不计, 只需要拷贝SQLite源代码或sqlite.exe可执行文件到目标主机, 然后直接运行就可以) 所以它非常适合用来讲解SQL语句. 同学们可以非常简单的创建他们喜欢的数据库, 然后通过电子邮件发给老师批注或打分. 对于那些感兴趣怎样实现一个关系型数据库管理系统(RDBMS)的高层次的学生, 按照模块化设计且拥有很好的注释和文档的SQLite源代码, 将为他们打下良好的基础. 这并不是说SQLite就是如何实现其他数据库引擎的精确模型, 但是很适合学生们了解SQLite是如何快速工作的, 从而掌握其他数据库系统的设计实现原则.

试验SQL语言的扩展

SQLite简单且模块化的设计使得它可以成为一个用来测试数据库语言特性或新想法的优秀的原型平台.

哪些场合适合使用其他的关系型数据库管理系统(RDBMS)
客户端/服务器程序

如果你有许多的客户端程序要通过网络访问一个共享的数据库, 你应当考虑用一个客户端/服务器数据库来替代SQLite. SQLite可以通过网络文件系统工作, 但是因为和大多数网络文件系统都存在延时, 因此执行效率不会很高. 此外大多数网络文件系统在实现文件逻辑锁的方面都存在着bug(包括Unix 和windows). 如果文件锁没有正常的工作, 就可能出现在同一时间两个或更多的客户端程序更改同一个数据库的同一部分, 从而导致数据库出错. 因为这些问题是文件系统执行的时候本质上存在的bug, 因此SQLite没有办法避免它们.

好的经验告诉我们, 应该避免在许多计算机需要通过一个网络文件系统同时访问同一个数据库的情况下使用SQLite.

高流量网站

SQLite通常情况下用作一个网站的后台数据库可以很好的工作. 但是如果你的网站的访问量大到你开始考虑采取分布式的数据库部署, 那么你应当毫不犹豫的考虑用一个企业级的客户端/服务器数据库来替代SQLite.

超大的数据集

当你在SQLite中开始一个事务处理的时候(事务处理会在任何写操作发生之前产生, 而不是必须要显示的调用BEGIN...COMMIT), 数据库引擎将不得不分配一小块脏页(文件缓冲页面)来帮助它自己管理回滚操作. 每1MB的数据库文件SQLite需要256字节. 对于小型的数据库这些空间不算什么, 但是当数据库增长到数十亿字节的时候, 缓冲页面的尺寸就会相当的大了. 如果你需要存储或修改几十GB的数据, 你应该考虑用其他的数据库引擎.

高并发访问

SQLite对于整个数据库文件进行读取/写入锁定. 这意味着如果任何进程读取了数据库中的某一部分, 其他所有进程都不能再对该数据库的任何部分进行写入操作. 同样的, 如果任何一个进程在对数据库进行写入操作, 其他所有进程都不能再读取该数据库的任何部分. 对于大多数情况这不算是什么问题. 在这些情况下每个程序使用数据库的时间都很短暂, 并且不会独占, 这样锁定至多会存在十几毫秒. 但是如果有些程序需要高并发, 那么这些程序就需要寻找其他的解决方案了

 

posted @ 2010-01-22 19:32 leeolevis 阅读(7) | 评论(0) |  编辑

[]

  特征:针对特定类型固定长度

Array

  特征:针对任意类型固定长度

List 

  特征:针对特定类型任意长度

ArrryList

  特征:针对任意类型任意长度

 

  C# 数组中每个元素的类型必须相同

  C# 数组的下标是从 0 开始

一维数组

  int[] arr = {1, 2, 3};

多维数组

  int[,] arr = { {1, 11}, {2, 12}, {3, 13} };

交错数组

  int[][][] arr = new int[1][][];

 

GridView

  特征:一行一条记录,就像新闻列表一样;带分页功能

DataList

  特征:一行可以有多条记录,就像图片列表一样;分页功能需要手写

Repeater

  特征:自由定制;分页功能需要手写

ListView

  特征:自由定制,功能强大;应用复杂;分页功能需要手写

DetailsView 控件

  特征:一条记录,一行一个字段;带分页功能

FormView

  特征:一条记录,自由定制;带分页功能

 

  C# 3.0 - var 隐式类型声明
  C# 3.0 -自动属性实现
  C# 3.0 -对象初始化设置
  C# 3.0 -集合初始化设置
  C# 3.0 -匿名类型
  C# 3.0 -扩展方法
  C# 3.0 - partial 分部(类型)  
  C# 3.0 - Lambda

 

重载

  必须位于同一个类中;

  方法名称必须相同;

  方法的参数要么类型不同,要么个数不同,要么类型个数均不同;

  返回值类型可以不同;

隐藏 

  必须位于基类和派生类中;

  方法名称必须相同;

  参数类型、参数个数必须相同;

  返回值类型可以不同;

  应该使用 new,虽然不使用 new 也会运行,但在编译时会被警告;

  调用派生类方法还是基类方法,取决于被什么类型的实例调用。

覆盖

  必须位于基类和派生类中;

  方法名称必须相同;

  参数类型、参数个数必须相同;

  返回值类型必须相同(与隐藏不同);

  必须使用关键字 virtual 和 override;

  即使把派生类的实例转换成基类类型,也无法调用基类中被覆盖的方法,因为它已经被覆盖了嘛,不像隐藏还有被“发掘”的机会。

 抽象

  可对类用 abstract,不对其方法用 abstract;

  但若对方法用 abstract,其类必须用 abstract;

  若类用了 abstract,方法没用 abstract,不表示方法也是 abstract;

  不能使用 new 来实例化抽象类;

  抽象方法不能有主体,只需要在参数写完后,直接收括号,引号结束;

  抽象的方法是隐式的 virtual 方法,所以它还有覆盖(改写、重写)的特点。

接口

  一个接口定义了一个契约。

  接口可以包容方法、C# 属性、事件、以及索引器。

  在一个接口声明中,我们可以声明零个或者多个成员。

  所有接口成员的默认访问类型都是 public。

  如果在接口成员声明中包括了任何修饰符,那么会产生一个编译器错误。

  与一个非抽象类类似,一个抽象类必须提供接口中所有成员的实现,只要这些成员在这个类的基类中出现过。

 

 partial

  分部(类型) 可以在任意一个类中声明 partial类型的方法 编译之后这些方法将合并

 

char

  char 关键字用于声明 U+0000 到 U+ffff 的 16 位 Unicode 字符。Unicode 字符是 16 位字符,用于表示世界上多数已知的书面语言,char 可以隐式转换为 ushort、int、uint、long、ulong、float、double 或 decimal。但是,不存在从其他类型到 char 类型的隐式转换。注意是隐式转换。

  为 char 类型变量赋值有四种方法:

    char c1 = 'X'; //注意是单引号
    char c2 = '\x0058'; //用十六进制表示
    char c3 = (char)88; //用数字转换
    char c4 = '\u0058'; //用 Unicode 表示

float

  float 是 4 个字节数,表示浮点数,它的表示方法,需要在数字后加“f”,大小写不敏感

  如:float f = 3.2f/float f = 3.2F;

decimal

  小数型)是一种高精度的 128 位数据类型,它所表示的范围从 1.0*10-28 到大约 7.9*1028。它的表示方法,需要在数字后加“m”,大小写不敏感

  如decimal m = 1.0m/decimal m = 1.0M;

 

值类型

  值类型有:byte(1)、sbyte(1)、short(2)、ushort(2)、int(4)、uint(4)、long(8)、ulong(8)、float(4)、double(8)、decimal(8)、char、bool、枚举、结构。

  上述中括号中的数字表示字节数,byte、ushort、uint、ulong 为无符号类型(没有负数),顺便说一下 sbyte 是有符号的字节。

  这些类型是.NET Framework 类型的别名的别名,具体对应关系,请参见由 String 与 string 引出的

引用类型

  引用类型有:对象类型、类类型、接口、代表元、字符串类型、数组。

  虽然字符串类型(string)是引用类型,但微软为了我们设计方便,重载了其中的一些操作符,使得它应用起来就像是值类型一样。

 

yield

  yield 关键字会告诉编译器当前的函数是在一个循环内部,编译器会相应生成一个执行它在循环体内部所表示行为的类,yield 和 return 关键字一起用于为枚举器对象提供返回值,比如说:在 foreach 内部的每一次循环内,yield 关键字用于终止当前循环

var

  自从 C# 3.0 开始,在函数作用局范围内声明的变量可以通过 var 关键字声明成隐含类型 , 隐含类型是强类型,你需要自己声明隐含类型本地变量,然后编译器会帮你决定为某种强类型。在 2.0 版本上跑的程序也可以使用 var 关键字,但是需要你的编译器是 3.0 以上版本并且设置代码输出版本为 2.0

using()

  定义一个范围,在范围外的对象将会被回收

readonly

  readonly 关键字是一个可作用在变量域上的修饰符,当一个变量域被 readonly 修饰后,这个变量只可在声明或者当前变量所属类的构造器内赋值   

as

  as 操作符很像一个类型转换器,然和,当转换无法发生时,as 会返回 null 而不是抛出一个异常  

default

  在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:T 是引用类型还是值类型。如果 T 为值类型,则它是数值还是结构。给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回 null,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或 null 的每个结构成员,具体取决于这些结构是值类型还是引用类型 :

  T temp = default(T);

global

  在 :: 运算符前面使用的 global 上下文关键字引用全局命名空间,该命名空间是任何 C# 程序的默认命名空间,未以其他方式命名。

  class TestClass : global::TestApp { }

volatile

  表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值

extern alias

  有时可能有必要引用具有相同完全限定类型名的程序集的两个版本,例如当需要在同一应用程序中使用程序集的两个或更多的版本时。通过使用外部程序集别名,来自每个程序集的命名空间可以在由别名命名的根级别命名空间内包装,从而可在同一文件中使用

  http://msdn.microsoft.com/en-us/library/ms173212%28VS.80%29.aspx

 

posted @ 2010-01-22 19:28 leeolevis 阅读(64) | 评论(0) |  编辑

人Ren都是达西,F#学习中,希望可以早日写出自己的F#版本,做个记号 

推荐地址:http://www.cnblogs.com/allenlooplee/archive/2009/03/26/1421960.html

原文地址:http://blogs.msdn.com/jomo_fisher/archive/2007/11/17/tight-code-a-puzzle-in-f.aspx

        public static void Main(string[] args)
        {
            
//现在的我 = [['a';'b';'1'];['c';'d';'2'];['e';'f';'3']] 
            
//想要变成 = [['a';'c';'e'];['b';'d';'f'];['1';'2';'3']] 
            string[,] list = { { "a""b""1" }, { "c""d""2" }, { "e""f""3" } };

            StringBuilder sb 
= new StringBuilder();
            sb.Append(
"{");
            
for (int i = 0; i < list.GetLength(0); i++)
            {
                sb.Append(
"{");
                
for (int j = 0; j < list.GetLength(1); j++)
                {
                    sb.Append(
"\"" + list[j, i] + "\",");
                }
                sb.Remove(sb.ToString().Length 
- 11);
                sb.Append(
"},");
            }
            sb.Remove(sb.ToString().Length 
- 11);
            sb.Append(
"}");
            Console.WriteLine(sb);
        }
posted @ 2009-12-16 17:38 leeolevis 阅读(61) | 评论(0) |  编辑
     摘要: 大家知道,平时我们追踪SQL语句的执行时都可以用SQLProfiler,不过使用其他数据库操作就不得而知了其实针对LINQ TO MORE 我们可以使用LINQ的DataContext.Log属性来查看或者记录LINQ TO 数据库的操作日志(貌似只能针对可以实例化的数据库连接类型,像LINQ TO XML这种除外),很菜很简单的东西,所以直接贴代码了代码 Code highlighting pr...  阅读全文
posted @ 2009-12-15 16:55 leeolevis 阅读(619) | 评论(0) |  编辑
     摘要: Lambda表达式实际上是一个匿名函数。它包含表达式和语句,常用于创建委托或表达式目录树类型。所有Lambda表达式都是用Lambda运算符---------- =>,该运算符读为“goesto”。Lambda运算符的左边是输入参数(可能没有),右边是表达式或语句块。Lambda表达式返回右边表达式的结果。其基本格式如下:(input paramenters)=>...  阅读全文
posted @ 2009-12-12 10:51 leeolevis 阅读(18) | 评论(0) |  编辑
     摘要: 创建型模式1.抽象工厂模式(Abstract Factory):提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。2.建造者模式(Builder):将一个浮躁对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。3.工厂模式(Factory ):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类。4.原型模式(Prototype):用...  阅读全文
posted @ 2009-12-12 10:47 leeolevis 阅读(10) | 评论(0) |  编辑
     摘要: 在LINQ中,数据源和查询结果实际上都是IEnumerable<T>或IQueryable<T>类型对象,所以可以通过使用普通对象的形式(调用方法、使用属性等)对数据源进行查询或使用查询结果数据。1.IEnumerable<T>接口IEnumerable<T>泛型接口支持在制定数据集合上进行迭代操作。它定义了一组扩展方法,用来对数据集合中的元素进行遍...  阅读全文
posted @ 2009-12-12 10:45 leeolevis 阅读(29) | 评论(0) |  编辑