posts - 71,comments - 26,trackbacks - 2
//如果文件有BOM则判断,如果没有就用系统默认编码,缺点:没有BOM的非系统编码文件会显示乱码。
//调用方法: EncodingType.GetType(filename)
//来源:http://blog.csdn.net/listlofusage/archive/2007/02/10/1506900.aspx
{ public static System.Text.Encoding GetType(string FILE_NAME)
{ FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
System.Text.Encoding r = GetType(fs); fs.Close(); return r; }
public static System.Text.Encoding GetType(FileStream fs) {
/*byte[] Unicode=new byte[]{0xFF,0xFE}; byte[] UnicodeBIG=new byte[]{0xFE,0xFF};
byte[] UTF8=new byte[]{0xEF,0xBB,0xBF};*/
BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default); byte[] ss = r.ReadBytes(3); r.Close();
//编码类型 Coding=编码类型.ASCII; if (ss[0] >= 0xEF) { if (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF) { return System.Text.Encoding.UTF8; } else if (ss[0] == 0xFE && ss[1] == 0xFF) { return System.Text.Encoding.BigEndianUnicode; } else if (ss[0] == 0xFF && ss[1] == 0xFE) { return System.Text.Encoding.Unicode; } else { return System.Text.Encoding.Default; } } else { return System.Text.Encoding.Default; } }
posted @ 2010-02-01 15:46 凌度 阅读(1) | 评论(0) |  编辑

1. Schemes -> Workflow Schemes 可以配置不同Issue Type使用不同的workflow.

Assign a workflow to an issue type for this scheme

 

2. Issue Settings -> Issue Types -> Issue Types Scheme

可以设定某个项目可见的Issue Type

 

3. Global Settings -> Workflows

设定不同的工作流

 

4. Issue Fields -> Screens

可以设定 状态跳转出现的出现的界面 或者 是不同Issue Type使用的界面

 

5. Issue Fields -> Screen Schemes

可以设定 不同Issue Type使用不同的screen

 

posted @ 2009-11-27 12:03 凌度 阅读(14) | 评论(0) |  编辑

正确实现 IDisposable 接口

来源:http://www.cnblogs.com/xlshcn/archive/2007/01/16/idisposable.html

 

.NET中用于释放对象资源的接口是IDisposable,但是这个接口的实现还是比较有讲究的,此外还有FinalizeClose两个函数。

MSDN建议按照下面的模式实现IDisposable接口:

 1 public class Foo: IDisposable
 2 {
 3     public void Dispose()
 4     {
 5        Dispose(true);
 6        GC.SuppressFinalize(this);
 7     }
 8 
 9     protected virtual void Dispose(bool disposing)
10     {
11        if (!m_disposed)
12        {
13            if (disposing)
14            {
15               // Release managed resources
16            }
17  
18            // Release unmanaged resources
19  
20            m_disposed = true;
21        }
22     }
23  
24     ~Foo()
25     {
26        Dispose(false);
27     }
28  
29     private bool m_disposed;
30 }
31  
32 

 

.NET的对象中实际上有两个用于释放资源的函数:DisposeFinalizeFinalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。

 

在这个模式中,void Dispose(bool disposing)函数通过一个disposing参数来区别当前是否是被Dispose()调用。如果是被Dispose()调用,那么需要同时释放托管和非托管的资源。如果是被~Foo()(也就是C#Finalize())调用了,那么只需要释放非托管的资源即可。

 

这是因为,Dispose()函数是被其它代码显式调用并要求释放资源的,而Finalize是被GC调用的。在GC调用的时候Foo所引用的其它托管对象可能还不需要被销毁,并且即使要销毁,也会由GC来调用。因此在Finalize中只需要释放非托管资源即可。另外一方面,由于在Dispose()中已经释放了托管和非托管的资源,因此在对象被GC回收时再次调用Finalize是没有必要的,所以在Dispose()中调用GC.SuppressFinalize(this)避免重复调用Finalize

 

然而,即使重复调用FinalizeDispose也是不存在问题的,因为有变量m_disposed的存在,资源只会被释放一次,多余的调用会被忽略过去。

 

因此,上面的模式保证了:

 

1、 Finalize只释放非托管资源;

2、 Dispose释放托管和非托管资源;

3、 重复调用FinalizeDispose是没有问题的;

4、 FinalizeDispose共享相同的资源释放策略,因此他们之间也是没有冲突的。

 

C#中,这个模式需要显式地实现,其中C#~Foo()函数代表了Finalize()。而在C++/CLI中,这个模式是自动实现的,C++的类析构函数则是不一样的。

 

按照C++语义,析构函数在超出作用域,或者delete的时候被调用。在Managed C++(即.NET 1.1中的托管C++)中,析构函数相当于CLR中的Finalize()方法,在垃圾收集的时候由GC调用,因此,调用的时机是不明确的。在.NET 2.0C++/CLI中,析构函数的语义被修改为等价与Dispose()方法,这就隐含了两件事情:

 

1、 所有的C++/CLI中的CLR类都实现了接口IDisposable,因此在C#中可以用using关键字来访问这个类的实例。

2、 析构函数不再等价于Finalize()了。

 

对于第一点,这是一件好事,我认为在语义上Dispose()更加接近于C++析构函数。对于第二点,Microsoft进行了一次扩展,做法是引入了“!”函数,如下所示: 

1 public ref class Foo
2 {
3 public:
4        Foo();
5        ~Foo();       // destructor
6        !Foo();       // finalizer
7 };
8 

 

“!”函数(我实在不知道应该怎么称呼它)取代原来Managed C++中的Finalize()GC调用。MSDN建议,为了减少代码的重复,可以写这样的代码: 

 1 ~Foo()
 2 {
 3     //释放托管的资源
 4     this->!Foo();
 5 }
 6  
 7 !Foo()
 8 {
 9     //释放非托管的资源
10 }
11 

 

对于上面这个类,实际上C++/CLI生成对应的C#代码是这样的:

 

 1 public class Foo
 2 {
 3     private void !Foo()
 4     {
 5        // 释放非托管的资源
 6     }
 7  
 8     private void ~Foo()
 9     {
10        // 释放托管的资源
11        !Foo();
12     }
13  
14     public Foo() 
15     {
16     }
17  
18     public void Dispose()
19     {
20        Dispose(true);
21        GC.SuppressFinalize(this);
22     }
23  
24     protected virtual void Dispose(bool disposing)
25     {
26        if (disposing)
27        {
28            ~Foo();
29        }
30        else
31        {
32            try
33            {
34               !Foo();
35            }
36            finally
37            {
38               base.Finalize();
39            }
40        }
41     }
42  
43     protected void Finalize()
44     {
45        Dispose(false);
46     }
47 }
48 

 

由于~Foo()!Foo()不会被重复调用(至少MS这样认为),因此在这段代码中没有和前面m_disposed相同的变量,但是基本的结构是一样的。

 

并且,可以看到实际上并不是~Foo()!Foo()就是DisposeFinalize,而是C++/CLI编译器生成了两个DisposeFinalize函数,并在合适的时候调用它们。C++/CLI其实已经做了很多工作,但是唯一的一个问题就是依赖于用户在~Foo()中调用!Foo()

 

关于资源释放,最后一点需要提的是Close函数。在语义上它和Dispose很类似,按照MSDN的说法,提供这个函数是为了让用户感觉舒服一点,因为对于某些对象,例如文件,用户更加习惯调用Close()

 

然而,毕竟这两个函数做的是同一件事情,因此MSDN建议的代码就是: 


1 public void Close()
2 {
3     Dispose(();
4 }
5 
6 

这里直接调用不带参数的Dispose函数以获得和Dispose相同的语义。这样似乎就圆满了,但是从另外一方面说,如果同时提供了DisposeClose,会给用户带来一些困惑。没有看到代码细节的前提下,很难知道这两个函数到底有什么区别。因此在.NET的代码设计规范中说,这两个函数实际上只能让用户用一个。因此建议的模式是: 

 1 public class Foo: IDisposable
 2 {
 3     public void Close()
 4     {
 5        Dispose();
 6     }
 7  
 8     void IDisposable.Dispose()
 9     {
10        Dispose(true);
11        GC.SuppressFinalize(this);
12     }
13  
14     protected virtual void Dispose(bool disposing)
15     {
16        // 同前
17     }
18 }
19 

 

这里使用了一个所谓的接口显式实现:void IDisposable.Dispose()。这个显式实现只能通过接口来访问,但是不能通过实现类来访问。因此:

 

1 Foo foo = new Foo();
2 
3 foo.Dispose(); // 错误
4 (foo as IDisposable).Dispose(); // 正确
5 

 

 

这样做到了兼顾两者。对于喜欢使用Close的人,可以直接用 foo.Close(),并且他看不到 Dispose()。对于喜欢Dispose的,他可以把类型转换为 IDisposable 来调用,或者使用using语句。两者皆大欢喜!

posted @ 2009-11-17 09:23 凌度 阅读(6) | 评论(0) |  编辑
Lua中,只有false和nil才被计算为false,而所有任何其它类型的值,都是true。比如0,空串等等
c语言中,0被当成false,而其他非0的任何值均被认为是true
c#语言中,bool只有true和false。 

        bool a = bool.Parse("true");
        bool b = bool.Parse("false");
        ushort i =  Convert.ToUInt16(a);  // i = 1
        ushort ii = Convert.ToUInt16(b);  // ii = 0
posted @ 2009-08-31 19:02 凌度 阅读(7) | 评论(0) |  编辑
原来mysql数据库里面有 "0000-00-00 00:00:00"这样的时间,会导致c#程序报错,然后就在连接字符串里面补偿了一个Allow Zero Datetime=true;
结果这样导致不能直接用拆箱方式转换mysql字段时间。必须使用DateTime.Phrase(时间.ToString());这样的形式。
posted @ 2009-08-31 15:52 凌度 阅读(83) | 评论(0) |  编辑
在编译环境调试没报错,在生产环境报错。用写字板打开dll。在内容最后面看到有
<dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
才知道要安装vc2008发布包 (vcredist_x86.exe)
posted @ 2009-08-17 12:34 凌度 阅读(20) | 评论(0) |  编辑
     摘要: cvs版本树(revision tree) 可以分为不同的分支(branches),每一个分支可以是一个独立的自我维护的开发线。而在一个分支中的变更可以很容易地移回到主干中。 每一个分支均有一个分支号(branch number),由奇数个“.”分开的十进制数组成。 把一个整数追加到对应分支赖以分离出的版本号上来创建分支号。使用分支号允许从一个特定版本分离出多个分支。 当 ...  阅读全文
posted @ 2009-08-07 14:48 凌度 阅读(62) | 评论(0) |  编辑
     摘要: 来源: shaovey的专栏在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。1.core文件的生成开关和大小限制---------------------------------1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会...  阅读全文
posted @ 2009-08-07 14:19 凌度 阅读(76) | 评论(0) |  编辑
     摘要: ---------------------------------------------------快速入门:ps aux|grep programname '查看进程ID(pid)gdb programname attach pidb a.cpp:120 '设置断点c '让程序继续运行(gdb) shell '切换到shell界面#exit '重新回到gdb模式----------------...  阅读全文
posted @ 2009-05-27 17:02 凌度 阅读(135) | 评论(0) |  编辑
     摘要: cent os 下的脚本是:lftp -c "open 192.168.22.1;user ftpusername ftppassword;put a_linux;put LinuxBuild.txt;exit"很多linux可以使用以下脚本:ftp -i -in <<!open 192.168.22.1user username password  阅读全文
posted @ 2009-05-27 16:55 凌度 阅读(138) | 评论(0) |  编辑