致朋友: 

 

 

 

 


  
  感谢你来到 简单天空 。这是我的个人Blog。
 

 

       1,搜索引擎过来的朋友,请使用下面的搜索,资料绝对能找到~~
        2,另为各位博主站长提供合租服务,联系QQ: 574276001
            地址是:http://shop34202471.taobao.com/ 
  祝你使用愉快!

 

 


分类: .net/C#预览模式: 普通 | 列表

先保存一个临时文件,然后再做其他处理。

 

这是思路,基本解决大部分类似问题。主要是系统线程锁定源文件引起。

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 18

C# 利用WinRAR (加密)压缩及解压缩 相关文件夹及文件 (转)收藏
本次示例主要实现:
1.压缩文件夹及其下文件
2.压缩文件夹下文件
3.压缩文件夹及其下文件为rar 还是 zip
4.解压缩
5.加密压缩及解加密压缩
-----------
示例代码如下:
protected void Button1_Click(object sender, EventArgs e)
    {
        string strtxtPath = Cfreezipfree.txt;
        string strzipPath = Cfreezipfree.zip;
        System.Diagnostics.Process Process1 = new System.Diagnostics.Process();
        Process1.StartInfo.FileName = Winrar.exe;
        Process1.StartInfo.CreateNoWindow = true;

         1
        压缩cfreezipfree.txt(即文件夹及其下文件freezipfree.txt)
        到cfreezipfree.rar
        strzipPath = Cfreezipfree;默认压缩方式为 .rar
        Process1.StartInfo.Arguments =  a -r  + strzipPath +   + strtxtPath;

         2
        压缩cfreezipfree.txt(即文件夹及其下文件freezipfree.txt)
        到cfreezipfree.rar
        strzipPath = Cfreezipfree;设置压缩方式为 .zip
        Process1.StartInfo.Arguments =  a -afzip  + strzipPath +   + strtxtPath;

         3
        压缩cfreezipfree.txt(即文件夹及其下文件freezipfree.txt)
        到cfreezipfree.zip  直接设定为free.zip
        Process1.StartInfo.Arguments =  a -r +strzipPath+  + strtxtPath ;

         4
        搬迁压缩cfreezipfree.txt(即文件夹及其下文件freezipfree.txt)
        到cfreezipfree.rar 压缩后 原文件将不存在
        Process1.StartInfo.Arguments =  m  + strzipPath +   + strtxtPath;

         5
        压缩cfreezip下的free.txt(即文件free.txt)
        到cfreezipfree.zip  直接设定为free.zip 只有文件 而没有文件夹
        Process1.StartInfo.Arguments =  a -ep  + strzipPath +   + strtxtPath;

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 28

之前,一直没有注意到这个问题,编辑器里的字体样式通常很大,

今天重新去看了官方的事例。

发现每个编辑实例都可以加载不同的css样式表,而且其样式不继承 页面的css。

 

于是我就单独建立个Editor.css

另外在属性设置上设置:

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 116

解决多用户频繁读取数据库的Cache

仔细模拟一下你的数据库程序,你有没有发现在计算时(特别是多用户计算时)经常重复读取数据库数据?!这是数据库处理程序的性能的最主要的杀手。

有些人说在写程序之前应该把算法想好,使得数据记录成批地、一次性地读取。但是这实际上往往不可能,因为复杂的程序贴近逻辑流程才清晰可维护。更何况这也不能解决多用户访问的情况。最好,我们根本不用在写程序时去考虑数据是否会被重复读取从而改变程序流程,但是又能自然而然地防止重复读取数据库。当对计算过程进行优化,而又不想破坏逻辑清晰性的时候,当然就是要依靠简单的Cache —— 对象只要能够缓存几秒钟就好。

下面我这里写一个世界上最懒惰的程序员使用.net写的一个最简单的Cache,但是它往往可以让复杂的计算程序大大提高计算速度。

 

C# code
using System; using System.Collections.Generic; namespace DomainBase { public class ObjectCache { //Dictionary<K,T> 会自动维护一个空链表来保存不用的单元。 //这里,使用被缓存对象的“弱引用”,允许这些对象被垃圾回收。 private Dictionary<string, WeakReference> Buffer = new Dictionary<string, WeakReference>(); public object this[string key] { get { WeakReference ret; if (Buffer.TryGetValue(key, out ret) && ret.IsAlive) return ret.Target; else return null; } set { WeakReference ret; if (Buffer.TryGetValue(key, out ret)) ret.Target = value; else Buffer.Add(key, new WeakReference(value)); } } public void Remove(string key) { Buffer.Remove(key); } } }



这就是最简单的Cache。例如:

public Class User
{
    static ObjectCache Buffer=new ObjectCache();

    public static GetUser(string id)
    {
      User ret=Buffer[id];
      if(ret==null)
      {
            ret=读取数据库产生User对象(id);
            Buffer[id]=ret;
      }
      return ret;
    }
.....

这里,在一个Dictionary <K,T>结构字典中保存了对象的key以及对象的“弱引用”。这样,当内存不足时GC会照样去释放被缓存的对象。当我们需要将对象在几秒钟内进行缓存时,使用这个最简单的Cache很有用。

.net framework中有非常多非常多的东西需要程序员去了解,不要仅仅抱着那些空洞、不实惠的“放之四海而皆准”的大部头的著作,有时间要多读一些实际地分析 .net framework 系统本身的方面的资料。在每一个技术中都可以找对一两个细节,这个细节就像掌握DNA技术一样能够让你不但扩展原理而且通过动手能力得到巨大实惠。

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 178

[私密日志]私密日志

该日志是私密日志,只有管理员或发布者可以查看!
分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 359

SQLite中的时间日期函数


SQLite包含了如下时间/日期函数:
datetime().......................产生日期和时间
date()...........................产生日期
time()...........................产生时间
strftime().......................对以上三个函数产生的日期和时间进行格式化

datetime()的用法是:datetime(日期/时间,修正符,修正符...)
date()和time()的语法与datetime()相同。

在时间/日期函数里可以使用如下格式的字符串作为参数:
YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
其中now是产生现在的时间。
举例(写这个笔记的时间是2006年10月17日晚8点到10点,测试环境:SQLite 2.8.17,WinXP,北京时间):
例1.
select datetime('now');
结果:2006-10-17 12:55:54
例2.
select datetime('2006-10-17');
结果:2006-10-17 12:00:00
例3.
select datetime('2006-10-17 00:20:00','+1 hour','-12 minute');
结果:2006-10-17 01:08:00
例4.
select date('2006-10-17','+1 day','+1 year');
结果:2007-10-18
例5.
select datetime('now','start of year');
结果:2006-01-01 00:00:00
例6.
select datetime('now','start of month');
结果:2006-10-01 00:00:00
例7.
select datetime('now','start of day');
结果:2006-10-17 00:00:00
例8.
select datetime('now','+10 hour','start of day','+10 hour');
结果:2006-10-17 10:00:00
例9.
select datetime('now','localtime');
结果:2006-10-17 21:21:47
例10.
select datetime('now','+8 hour');
结果:2006-10-17 21:24:45
例3中的+1 hour和-12 minute表示可以在基本时间上(datetime函数的第一个参数)增加或减少一定时间。
例5中的start of year表示一年开始的时间。
从例8可以看出,尽管第2个参数加上了10个小时,但是却被第3个参数“start of day”把时间归零到00:00:00,随后的第4个参数在00:00:00
的基础上把时间增加了10个小时变成了10:00:00。

例9把格林威治时区转换成本地时区。

例10把格林威治时区转换成东八区。

strftime()函数可以把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其它形式的字符串。
strftime()的语法是strftime(格式, 日期/时间, 修正符, 修正符, ...)

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 197
C#代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Web;   
  4. using System.Web.UI;   
  5. using System.Web.UI.WebControls;   
  6.   
  7. using System.IO;   
  8. using System.Data.Common;   //DbProviderFactory   
  9. using System.Data.SQLite;   
  10.   
  11. using System.Diagnostics;   //Stopwatch   
  12. public partial class _Default : System.Web.UI.Page   
  13. {   
  14.     protected void Page_Load(object sender, EventArgs e)   
  15.     {   
  16.   
  17.     }   
  18.     protected void Button1_Click(object sender, EventArgs e)   
  19.     {   
  20.   
  21.         File.Delete(Server.MapPath("_Data/sqldb.db"));   
  22.         SQLiteConnection.CreateFile(Server.MapPath("_Data/sqldb.db"));   
  23.            
  24.         DbProviderFactory factory = SQLiteFactory.Instance;   
  25.         using (DbConnection conn = factory.CreateConnection())   
  26.         {   
  27.             // 开始计时   
  28.             Stopwatch watch = new Stopwatch();   
  29.             watch.Start();   
  30.             // 连接数据库   
  31.             conn.ConnectionString = "Data Source=" + Server.MapPath("_Data/sqldb.db");   
  32.             conn.Open();   
  33.   
  34.             // 创建数据表   
  35.             string sql = "create table [test] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";   
  36.             DbCommand cmd = conn.CreateCommand();   
  37.             cmd.Connection = conn;   
  38.             cmd.CommandText = sql;   
  39.             cmd.ExecuteNonQuery();   
  40.   
  41.             // 添加参数   
  42.             cmd.Parameters.Add(cmd.CreateParameter());   
  43.   
  44.   
  45.             // 停止计时   
  46.             watch.Stop();   
  47.             Console.WriteLine(watch.Elapsed);   
  48.             Response.Write(watch.Elapsed);   
  49.             watch.Start();   
  50.             DbTransaction trans = conn.BeginTransaction(); // <-------------------   
  51.             try  
  52.             {   
  53.                 // 连续插入1000条记录   
  54.                 for (int i = 0; i < 1000; i++)   
  55.                 {   
  56.                     cmd.CommandText = "insert into [test] ([s]) values (?)";   
  57.                     cmd.Parameters[0].Value = i.ToString();   
  58.   
  59.                     cmd.ExecuteNonQuery();   
  60.                 }   
  61.   
  62.                 trans.Commit(); // <-------------------   
  63.             }   
  64.             catch  
  65.             {   
  66.                 trans.Rollback(); // <-------------------   
  67.                 throw// <-------------------   
  68.             }   
  69.   
  70.             watch.Stop();   
  71.             Console.WriteLine(watch.Elapsed);   
  72.             Response.Write(watch.Elapsed);   
  73.             conn.Close();   
  74.             conn.Dispose();   
  75.         }   
  76.     }   
  77.     protected void Button2_Click(object sender, EventArgs e)   
  78.     {   
  79.   
  80.         DbProviderFactory factory = SQLiteFactory.Instance;   
  81.         using (DbConnection conn = factory.CreateConnection())   
  82.         {   
  83.             conn.ConnectionString = "Data Source=" + Server.MapPath("_Data/" + "sqldb.db");   
  84.             conn.Open();   
  85.   
  86.   
  87.             // 创建数据表   
  88.             string sql = "select * from [test]";   
  89.             DbCommand cmd = conn.CreateCommand();   
  90.             cmd.Connection = conn;   
  91.             cmd.CommandText = sql;   
  92.             DbDataReader dr = cmd.ExecuteReader();   
  93.             while (dr.Read())   
  94.             {   
  95.                 TextBox1.Text += dr["s"] + "\n";   
  96.             }   
  97.             dr.Close();   
  98.             dr.Dispose();   
  99.             conn.Close();   
  100.             conn.Dispose();   
  101.         }   
  102.     }   
  103. }   

 

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 180

Repeater自动编号 及分页问题

我用Repeater和PagedDataSource邦定后,可以按照每页20行的设置进行分页。分页后,我想在第一列的左边显示每行的序号。就用 <%# Container.ItemIndex + 1%>来实现,可是这样做的结果是:第一页显示从1到20的编号,第二页还是显示从1到20的编号,第三页还是显示从1到20的编号…………

我想要的结果是:
第一页显示从1到20的编号,第二页显示从21到40的编号,第三页显示从41到60的编号…………

请问:这种效果怎样实现呢?

 

<%# (Container.ItemIndex + 1)+(当前页数-1)*10 %>

<%# pagesize*pageindex + Container.ItemIndex + 1%>
pagesize--每页显示条数
pageindex--当前页码,记住要从0开始

另外 SQL的 Top N语句 在相同排序的字段会出现误算

比如2行时间一样的记录

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 283

using语句 using指令  C# 语言参考

using  C# 语言参考
  using 关键字有两个主要用途:
  (一).作为语句,用于定义一个范围,在此范围的末尾将释放对象
  C# 通过 .NET Framework 公共语言运行库 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放具有不确定性;一旦 CLR 决定执行垃圾回收,就会释放内存。但是,通常最好尽快释放诸如文件句柄和网络连接这样的有限资源。
  using 语句允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。
  可以在到达 using 语句的末尾时,或者在该语句结束之前引发了异常并且控制权离开语句块时,退出 using 语句。
  1. 可以在 using 语句中声明对象(如上所示),或者在 using 语句之前声明对象,如下所示:
  Font font2 = new Font("Arial", 10.0f);
  using (font2)
  {
  // use font2
  }
  2. 可以有多个对象与 using 语句一起使用,但是必须在 using 语句内部声明这些对象,如下所示:
  Font font2 = new Font("Arial", 10.0f);
  using (font2)
  {
  // use font2
  }
  3.可以有多个对象与 using 语句一起使用,但是必须在 using 语句内部声明这些对象,如下所示:
  using (Font font3 = new Font("Arial", 10.0f),
  font4 = new Font("Arial", 10.0f))
  {
  // Use font3 and font4.
  }
  示例:
  下面的示例显示用户定义类可以如何实现它自己的 Dispose 行为。注意类型必须从 IDisposable 继承。
  using System;
  class C : IDisposable
  {
  public void UseLimitedResource()
  {
  Console.WriteLine("Using limited resource...");
  }
  void IDisposable.Dispose()
  {
  Console.WriteLine("Disposing limited resource.");
  }
  }
  class Program
  {
  static void Main()
  {
  using (C c = new C())
  {
  c.UseLimitedResource();
  }
  Console.WriteLine("Now outside using statement.");
  Console.ReadLine();
  }
  }
  (二).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型
  ①.允许在命名空间中使用类型,这样,您就不必在该命名空间中限定某个类型的使用:
  using System.Text;
  ②.为命名空间或类型创建别名。
  using Project = PC.MyCompany.Project;
  using 指令的范围限制为包含它的文件。
  创建 using 别名,以便更易于将标识符限定到命名空间或类型。
  创建 using 指令,以便在命名空间中使用类型而不必指定命名空间。using 指令不为您提供对嵌套在指定命名空间中的任何命名空间的访问。
  命名空间分为两类:用户定义的命名空间和系统定义的命名空间。用户定义的命名空间是在代码中定义的命名空间。若要查看系统定义的命名空间的列表
   1.下面的示例显示了如何为命名空间定义和使用 using 别名:
  namespace PC
  {
  // Define an alias for the nested namespace.
  using Project = PC.MyCompany.Project;
  class A
  {
  void M()
  {
  // Use the alias
  Project.MyClass mc = new Project.MyClass();
  }
  }
  namespace MyCompany
  {
  namespace Project
  {
  public class MyClass{}
  }
  }
  }
   2.下面的示例显示了如何为类定义 using 指令和 using 别名:
  // cs_using_directive2.cs
  // Using directive.
  using System;
  // Using alias for a class.
  using AliasToMyClass = NameSpace1.MyClass;
  namespace NameSpace1
  {
  public class MyClass
  {
  public override string ToString()
  {
  return "You are in NameSpace1.MyClass";
  }
  }
  }
  namespace NameSpace2
  {
  class MyClass
  {
  }
  }
  namespace NameSpace3
  {
  // Using directive:
  using NameSpace1;
  // Using directive:
  using NameSpace2;
  class MainClass
  {
  static void Main()
  {
  AliasToMyClass somevar = new AliasToMyClass();
  Console.WriteLine(somevar);
  }
  }
  }
  输出: You are in NameSpace1.MyClass
  =========================================================================================
[编辑本段]深入讨论
  1. 引言
  在.NET大家庭中,有不少的关键字承担了多种角色,例如new关键字就身兼数职,除了能够创建对象,在继承体系中隐藏基类成员,还在泛型声明中约束可能用作类型参数的参数,在详细讨论using的多重身份的基础上来了解.NET在语言机制上的简便与深邃。
  那么,using的多重身份都体现在哪些方面呢,我们先一睹为快吧:
  · 引入命名空间
  · 创建别名
  · 强制资源清理
  下面,本文将从这几个角度来阐述using的多彩应用。
  2. 引入命名空间
  using作为引入命名空间指令的用法规则为:
  using Namespace;
  在.NET程序中,最常见的代码莫过于在程序文件的开头引入System命名空间,其原因在于System命名空间中封装了很多最基本最常用的操作,下面的代码对我们来说最为熟悉不过:
  using System;
  这样,我们在程序中就可以直接使用命名空间中的类型,而不必指定详细的类型名称。using指令可以访问嵌套命名空间。
  关于:命名空间
  命名空间是.NET程序在逻辑上的组织结构,而并非实际的物理结构,是一种避免类名冲突的方法,用于将不同的数据类型组合划分的方式。例如,在.NET中很多的基本类型都位于System命名空间,数据操作类型位于System.Data命名空间,
  误区:
  · using类似于Java语言的import指令,都是引入命名空间(Java中称作包)这种逻辑结构;而不同于C语言中的#include指令,用于引入实际的类库,
  · using引入命名空间,并不等于编译器编译时加载该命名空间所在的程序集,程序集的加载决定于程序中对该程序集是否存在调用操作,如果代码中不存在任何调用操作则编译器将不会加载using引入命名空间所在程序集。因此,在源文件开头,引入多个命名空间,并非加载多个程序集,不会造成“过度引用”的弊端。 using为命名空间创建别名的用法规则为:
  using alias = namespace | type;
  其中namespace表示创建命名空间的别名;而type表示创建类型别名。例如,在.NET Office应用中,常常会引入Microsoft.Office.Interop.Word.dll程序集,在引入命名空间时为了避免繁琐的类型输入,我们通常为其创建别名如下:
  using MSWord = Microsoft.Office.Interop.Word;
  这样,就可以在程序中以MSWord来代替Microsoft.Office.Interop.Word前缀,如果要创建Application对象,则可以是这样,
  private static MSWord.Application ooo = new MSWord.Application();
  同样,也可以创建类型的别名,用法为:
  using MyConsole = System.Console;
  class UsingEx
  {
  public static void Main()
  {
  MyConsole.WriteLine("应用了类的别名。");
  }
  }
  而创建别名的另一个重要的原因在于同一cs文件中引入的不同命名空间中包括了相同名称的类型,为了避免出现名称冲突可以通过设定别名来解决,例如:
  namespace Boyspace
  {
  public class Player
  {
  public static void Play()
  {
  System.Console.WriteLine("Boys play football.");
  }
  }
  }
  namespace Girlspace
  {
  public class Player
  {
  public static void Play()
  {
  System.Console.WriteLine("Girls play violin.");
  }
  }
  }
  以using创建别名,有效的解决了这种可能的命名冲突,尽管我们可以通过类型全名称来加以区分,但是这显然不是最佳的解决方案,using使得这一问题迎刃而解,不费丝毫功夫,同时在编码规范上看来也更加的符合编码要求。
  4. 强制资源清理
  4.1 由来
  要理解清楚使用using语句强制清理资源,就首先从了解Dispose模式说起,而要了解Dispose模式,则应首先了解.NET的垃圾回收机制。这些显然不是本文所能完成的宏论,我们只需要首先明确的是.NET提供了Dispose模式来实现显式释放和关闭对象的能力。
  Dispose模式
  Dispose模式是.NET提供的一种显式清理对象资源的约定方式,用于在.NET 中释放对象封装的非托管资源。因为非托管资源不受GC控制,对象必须调用自己的Dispose()方法来释放,这就是所谓的Dispose模式。从概念角度来看,Dispose模式就是一种强制资源清理所要遵守的约定;从实现角度来看,Dispose模式就是让要一个类型实现IDisposable接口,从而使得该类型提供一个公有的Dispose方法。
  本文不再讨论如何让一个类型实现Dispose模式来提供显示清理非托管资源的方式,而将注意集中在如何以using语句来简便的应用这种实现了Dispose模式的类型的资源清理方式。我们在内存管理与垃圾回收章节将有详细的讨论。
  using语句提供了强制清理对象资源的便捷操作方式,允许指定何时释放对象的资源,其典型应用为:
  using (Font f = new Font("Verdana", 12, FontStyle.Regular))
  {
  //执行文本绘制操作
  Graphics g = e.Graphics;
  Rectangle rect = new Rectangle(10, 10, 200, 200);
  g.DrawString("Try finally dispose font.", f, Brushes.Black, rect);
  }//运行结束,释放f对象资源
  在上述典型应用中,using语句在结束时会自动调用欲被清除对象的Dispose()方法。因此,该Font对象必须实现IDispose接口,才能使用using语句强制对象清理资源。我们查看其类型定义可知:
  public sealed class Font : MarshalByRefObject, ICloneable, ISerializable, IDisposable
  Font类型的确实现了IDisposeable接口,也就具有了显示回收资源的能力。然而,我们并未从上述代码中,看出任何使用Dispose方法的蛛丝马迹,这正式using语句带来的简便之处,其实质究竟怎样呢?
  4.2 实质
  要想了解using语句的执行本质,了解编译器在背后做了哪些手脚,就必须回归到IL代码中来揭密才行:
  .method public hidebysig static void Main() cil managed
  {
  .entrypoint
  // 代码大小 40 (0x28)
  .maxstack 4
  .locals init ([0] class [System.Drawing]System.Drawing.Font f,
  [1] bool CS$4$0000)
  IL_0000: nop
  IL_0001: ldstr "Verdana"
  IL_0006: ldc.r4 12.
  IL_000b: ldc.i4.0
  IL_000c: newobj instance void [System.Drawing]System.Drawing.Font::.ctor(string,float32,
  valuetype [System.Drawing]System.Drawing.FontStyle)
  IL_0011: stloc.0
  .try
  {
  ……部分省略……
  } // end .try
  finally
  {
  ……部分省略……
  IL_001f: callvirt instance void [mscorlib]System.IDisposable::Dispose()
  IL_0024: nop
  IL_0025: endfinally
  } // end handler
  IL_0026: nop
  IL_0027: ret
  } // end of method UsingDispose::Main
  显然,编译器在自动将using生成为try-finally语句,并在finally块中调用对象的Dispose方法,来清理资源。
  在.NET规范中,微软建议开放人员在调用一个类型的Dispose()或者Close()方法时,将其放在异常处理的finally块中。根据上面的分析我们可知,using语句正是隐式的调用了类型的Dispose方法,因此以下的代码和上面的示例是完全等效的:
  Font f2 = new Font("Arial", 10, FontStyle.Bold);
  try
  {
  //执行文本绘制操作
  Graphics g = new Graphics();
  Rectangle rect = new Rectangle(10, 10, 200, 200);
  g.DrawString("Try finally dispose font.", f2, Brushes.Black, rect);
  }
  finally
  {
  if (f2 != null)
  ((IDisposable)f2).Dispose();
  }
  4.3 规则
  · using只能用于实现了IDisposable接口的类型,禁止为不支持IDisposable接口的类型使用using语句,否则会出现编译时错误;
  · using语句适用于清理单个非托管资源的情况,而多个非托管对象的清理最好以try-finnaly来实现,因为嵌套的using语句可能存在隐藏的Bug。内层using块引发异常时,将不能释放外层using块的对象资源。
  · using语句支持初始化多个变量,但前提是这些变量的类型必须相同,例如:
  using(Pen p1 = new Pen(Brushes.Black), p2 = new Pen(Brushes.Blue))
  {
  //
  }
  否则,编译将不可通过。不过,还是有变通的办法来解决这一问题,原因就是应用using语句的类型必然实现了IDisposable接口,那么就可以以下面的方式来完成初始化操作,
  using (IDisposable font = new Font("Verdana", 12, FontStyle.Regular), pen = new Pen(Brushes.Black))
  {
  float size = (font as Font).Size;
  Brush brush = (pen as Pen).Brush;
  }
  另一种办法就是以使用try-finally来完成,不管初始化的对象类型是否一致。
  · Dispose方法用于清理对象封装的非托管资源,而不是释放对象的内存,对象的内存依然由垃圾回收器控制。
  · 程序在达到using语句末尾时退出using块,而如果到达语句末尾之前引入异常则有可能提前退出。
  · using中初始化的对象,可以在using语句之前声明,例如:
  Font f3 = new Font("Verdana", 9, FontStyle.Regular);
  using (f3)
  {
  //执行文本绘制操作
  }
  5. 结论
  一个简单的关键字,多种不同的应用场合。本文从比较全面的角度,诠释了using关键字在.NET中的多种用法,值得指出的是这种用法并非实现于.NET的所有高级语言,本文的情况主要局限在C#中。

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 118

Head First C# 深入浅出 中文版


<本书介绍>

你将从本书学到什么?

《深入浅出 C#》是一段物件导向编程、C#、Visual Studio IDE 的完整学习经验。本书专为你的大脑量身打造,内容涵盖 C# 3.0 与 Visual Studio 2008,并且教导你许多事情,从垃圾收集机制(Garbage Collection)、扩展方法(Extension Method)、到双缓衝动画(double buffered animation)都有。另外,你也将精通 C# 最热门与最新的 LINQ 语法,可於 .NET 群集、SQL 资料库、等资料来源中查询你的资料。完成本书的阅读之时,你将是一个熟练的 C# 程式设计师,并且有能力设计与撰写大型应用程式。

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 195

用于Asp.Net的敏感内容评审控件

 

image引言
之前在这篇文章中分享了敏感内容评审类及其辅助工具:http://www.cnblogs.com/SkyD/archive/2009/08/21/1551112.html
此次分享的工具是在Asp.Net中使用的,其功能就是在网站后台中可视化地显示评审内容明细,以供评审人员参考。
评审人员可通过此控件一目了然地了解由机器分析得出的评审结果,继而更好地进行二次评审。
 
使用方法
接下来演示基本的使用方法。
在VisualStudio中新建一个Web项目,引用此控件的dll:
image
在App_Data目录上执行“添加现有项”命令,将上一篇文章中分享的示例配置规则添加进去:
image
新建Global.asax,在其代码中写入以下代码,以进行初始化:
image
在页面顶部加入声明:
<%Register assembly="AuditingReader" namespace="AuditingReader" tagprefix="cc1" %>
在页面中加入以下代码:
<cc1:AuditingReader ID="AuditingReader1" runat="server" />
<br />
<asp:TextBox ID="TextBox1" runat="server" Rows="12" TextMode="MultiLine" Width="627px"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="审查" onclick="Button1_Click" />
上述代码在设计视图中的显示:
image
在后台代码的按钮单击事件中写入:
image
编译并运行即可。
 
显示效果
在文本框中输入文字,单击“审查”按钮,即可看到机器分析出的评审结果。
我找了一篇比较有代表性的文章用作测试,其原文地址为:http://bbs.tiexue.net/post_2760917_1.html
image
显示匹配项的匹配表达式:
image
隐/显特定分类的匹配项:
image
反白显示特定匹配项:
image
 
结语
还是有很多人不理解站长的难处,说什么“助纣为虐”一类的话,其实站长对于言论的控制是出于自保目的,谁都不希望自己苦心经营的网站说关门就关门。
或许政府的言论控制比站长宽松一些,但对于站长来说,肯定是多一事不如少一事,这是合情合理的。
我的这个审查方案相比现存的各种言论控制方案来说,应该算是比较温和的了,效率较高、给用户造成的困扰极少,并因结合了人工审核而具有较高的准确性,较大限度地平衡了用户与网站运营者间的利益,这也正是我编写并分享此方案的初衷。
 
更多相关信息,可以参看我此系列的其他各篇文章:
 
资源下载
其它相关源代码及工具请在上篇文章中下载:http://www.cnblogs.com/SkyD/archive/2009/08/21/1551112.html
 

 

 

 

通过本类库,可以实现对输入内容的自动分析,并会给出评分,程序可以根据此评分判断内容是否达到某一敏感度级别,从而进行相应的自动化处理。

如果将此类库与人工评审相结合,效果将会非常好:机审认为有敏感嫌疑的内容自动提交到人工评审等待列表,由人工进行二次审核,这样在保证效率的同时又兼顾了准确性,是比较理想的人机协作方式。
此类库的运作原理请参考《改进的脏话审查方案》一文:http://www.cnblogs.com/SkyD/archive/2009/03/16/updateTextVali.html
 
编写审查规则
光有此类库并不能评审任何内容,你需要为其提供审查规则,它才能够工作,为此我将提供一个生成器,用以生成规则配置文件:
image
关于规则的应用原理,也请参看《改进的脏话审查方案》一文。
这里说明一下评分的计算方式:
规则的分值属性代表这个规则的满分值,也就是说当文中的词语与此规则完全匹配时的得分,如果可以匹配但不精确则依据精确程度得到相应比例的部分分值。
而匹配精确程度的计算方式,就是通过其精确长度属性与其实际匹配内容的长度间的比例计算的。比如“白[\s\S]{0,3}?痴”这条规则,其精确长度是2,即刨除可容忍的干扰符号后的原字符串“白痴”的长度,假如遇到“有一个小白正在痴痴地望着她”这句话,也会与“白正在痴”发生匹配,但其长度为4,通过用规则的精确长度值2除以实际匹配到的字符串长度4,就得出了我们此次匹配的精确度:50%,然后假如此规则的分值为6的话,那么此次匹配则只能得到6*0.5=3分。
这是精确分值的计算方式,除此之外类库也会同时输出不进行精确度修正的分值,以适用于不同情况。
另外有一点需要注意:此类库的输入规则必须为简体中文,但在匹配时会对简体与繁体都进行匹配。
 
调用方法
调用此类库前,应当首先通过规则配置生成器,生成一个或多个规则配置文件,并将它们放在一个目录中。
然后为其静态属性赋值,指示上述规则配置文件的存储路径,然后执行其静态的“加载审查规则”方法:
内容审查.规则文件目录 Path.Combine(Application.StartupPath, "内容审查规则\\");
内容审查.加载审查规则();
这样就完成了初始化,然后只需创建“内容审查”对象,并传入待分析的字符串,执行“审查”方法即可完成评审:
内容审查 c = new 内容审查(textBox2.Text);
c.审查();
执行之后即可访问该对象的“累计评分”、“累计精确评分”、“最高评分”、“输出明细”等属性,获取相应的评审结果了。
此外,“审查”方法还有一个重载,允许放弃输出明细匹配信息,仅输出其他的分值和统计信息,以提高评审速度,一般在机审时应当这样使用,而在人工复审时输出明细信息供操作员参考。
 
应用测试
我提供了一个测试工具,用以进行简单的规则测试。
我们以译言中的一篇文章为例进行评审测试,其原文地址为:http://www.yeeyan.com/articles/view/24994/7075
测试结果:
image
标题栏处显示的“捕获内容覆盖率”也是审查后提供的统计信息,用以表示敏感内容占据全文的比例,在进行自动后续处理时,此属性也应当作为一个重要的判定依据。比如有些内容很短,并遍布着敏感词汇,但因其内容少所以总分并不会太高,而其覆盖率却会非常高,这时以覆盖率为判别依据就不会漏掉此内容。
 
 
窗口左下方显示的“[宗教]”、“[政治]”表示规则的分类,即规则所属的配置文件的文件名。
 
结语
此类库对于网站中的用户输入内容审查工作非常有用,善加利用,将远比寻常的关键字替换、关键字禁止提交、纯人工审核等方案优秀得多,使安全性与效率趋于平衡。
各位如有功能或性能方面的改进建议,欢迎提出,共同探讨。
另外,我还会后续放出一个用于在Asp.Net中使用的可视化人工审核辅助控件,敬请关注。
 
下载
规则配置文件包中包含以下规则配置示例:
image
分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 100

Visual C# 中XML注释的使用(含注释在开发时显示换行)

在C#智能注释时,常常希望它能在开发时显示为换行,使得提示更加友好!原来一直想怎么实现,今天偶然发现原来如此简单,只需将<para> 标记用于诸如 <summary>、<remarks> 或 <returns> 等标记内即可。环境:VS.NET2008

一、注释在开发时换行显示的办法

<para> 标记用于诸如 <summary>、<remarks> 或 <returns> 等标记内,使您得以将结构添加到文本中。

/// <summary>
/// 基类(第1行)
///<para>说明:(第2行)</para>
///<para>  封装一些常用的成员(第3行)</para>
///<para>  前面要用全角空格才能显示出空格来(第4行)</para>
/// </summary>
public class MyBase 
{
    /// <summary>
    /// 构造函数(第1行)
    ///<para>说明:(第2行)</para>
    ///<para>  初始化一些数据(第3行)</para>
    /// </summary>
    public MyBase()
    {
         //
    //TODO: 在此处添加构造函数逻辑
    //
    }
}

二、XML注释

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 201

把XML数据绑定到 DropDownList 和Repeater

好处多多

1、节约数据库开销,又让数据和程序分离

2、便于分层架构

基础代码:

C#代码
  1. protected void Page_Load(object sender, EventArgs e)   
  2. {   
  3.   
  4.     DropDownList1.DataSource = createDataSource();   
  5.     DropDownList1.DataTextField = "id";   
  6.     DropDownList1.DataValueField = "name";   
  7.     DropDownList1.DataBind();   
  8.   
  9.     Repeater1.DataSource = createDataSource();   
  10.     Repeater1.DataBind();   
  11. }   
  12. private DataView createDataSource()   
  13. {   
  14.     DataTable dt = new DataTable();   
  15.   
  16.     dt.Columns.Add("id"typeof(string));   
  17.     dt.Columns.Add("name"typeof(string));   
  18.     DataSet lanDS = new DataSet();   
  19.     lanDS.ReadXml(Server.MapPath("tmp2.xml"));   
  20.   
  21.     if (lanDS.Tables.Count > 0)   
  22.     {   
  23.         foreach (DataRow copyRow in lanDS.Tables[0].Rows)   
  24.         {   
  25.             dt.ImportRow(copyRow);   
  26.         }   
  27.     } DataView dv = new DataView(dt);   
  28.   
  29.     return dv;   
  30. }   

前台代码:

C#代码
  1. <asp:DropDownList ID="DropDownList1" runat="server">   
  2. </asp:DropDownList>   
  3. <br />   
  4. <br />   
  5. <br />   
  6. <asp:Repeater ID="Repeater1" runat="server">   
  7.     <ItemTemplate>   
  8.         <%# Eval("id") %>   
  9.         :   
  10.         <%# Eval("name") %>   
  11.     </ItemTemplate>   
  12. </asp:Repeater>  

XML:

 

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <colors>  
  3.   <color>  
  4.     <id>1</id>  
  5.     <name>English</name>  
  6.   </color>  
  7. <color>  
  8.     <id>2</id>  
  9.     <name>中文</name>     
  10. </color>  
  11.   <color>  
  12.     <id>3</id>  
  13.     <name>中文</name>  
  14.   </color>  
  15. </colors>  

 

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 166

DateTime.Ticks

public long Ticks {get;}
   
 属性值

表示此实例的日期和时间的刻度数。该值介于 MinValueMaxValue 之间。

备注

此属性的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。


好了一个返回的是毫秒一个返回的是微秒,所以知道毫秒与微妙之间的转化也是有必要的

1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)
1秒=1,000,000,000 纳秒(ns)
1纳秒=1/1,000,000,000秒(s)
1秒=1,000,000,000,000 皮秒(ps)
1微毫秒=1纳秒
1纳秒=10埃秒

 

1 毫秒 = 10^-3 秒, ------->10的-3次方 小数点从1开始向左移3位即0.001
1 微秒 = 10^-6 秒,
1 毫微秒 = 10^-9 秒,
100 毫微秒 = 10^-7 秒。

 

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 254

asp.net C# 性能优化的简单设置

1.关闭使用后的数据连接

      访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。


   连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能。因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕后马上关闭,从而尽量减少数据库连接打开的时间,避免出现超出连接限制的情况。

用(推荐)
using(SqlDataReader dr = SH.ExecSqlDataReader(sql))
{
   if (dr.Read())
   {
  
   }
}
{}//不必显示关闭,在using{}大括号之后就会释放


try{conn.Open();}
catch{}
finally{conn.Close();}

2.必要时使用Asp.net缓存机制

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 210

深入分析C# 类属性

本质地讲 类。属性——它也是一种方法

C#代码
  1. 类.属性= "值";  

我们设置的时候是这样,读取的时候也很简单

C#代码
  1. 我的类 mycls = new 我的类();   
  2. mycls.属性 = "值1";   
  3. Response.Write(mycls.属性);   
  4. mycls.属性 = "值2";   
  5. Response.Write(mycls.属性);  

类的属性用途很广泛:

1、给类内部传递固定参数,增加类的灵活性。(相信在高手写的那些类中你可以看到很多初始化的东西,那其中就很多是用这个东东搞出来的,可以让你72变低使用高手写的东西)

2、全局性的参数传递(这里是指在调用类的地方,能够跨越,有点全局变量的感觉。)

 

查看更多...

分类:.net/C# | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 426