摘要: 偶尔在园子里看到.net的轻量级ORM框架Petapoco的介绍,觉得很有趣。相关介绍:PetaPoco:适用于.NET的微型ORM正好最近有个C#+Oracle11g的项目,想趁此机会试试用petapoco来做数据层的框架。在配置步骤和遇到的问题,记录如下。1. 首先配置ODP.net,使得可以通过C#来连接Oracle。配置ODP.net的方法请参考我之前的博客:C# 连接Oracle(利用ODP.net,不安装oracle客户端)2. 安装Petapoco安装Petapoco,首先得安装Nuget,可以通过VisualStudio2010的Extention Manager来搜索,并安装 阅读全文
posted @ 2011-07-12 23:46 wang_yb 阅读(6002) 评论(12) 推荐(1)
摘要: 为了方便部署连接oracle的.net程序,oracle官方提供了一个简化版的client,即instant client。通过instant client和ODP.net中的Oracle.DataAccess.dll,我们就可以方便的部署.net应用程序或者站点。1. ODAC的安装在oracle的官方网站上下载与你安装的oracle对应版本的ODAC。下载地址:ODAC Download下载好后解压安装,安装时不用安装全部的组件。主要安装以下组件:Oracle Instant ClientOracle Data Provider For .net2.0Oracle rovider For 阅读全文
posted @ 2011-07-11 20:31 wang_yb 阅读(34138) 评论(15) 推荐(4)
摘要: 熟悉C#中的事件机制,使得我们可以编写出更加贴近于实际情况的程序。主要内容:本例中事件的场景介绍事件的构造注册/注销事件事件在编译器中的实现显式实现事件1. 本例中事件的场景介绍为了更好的介绍事件的机制,首先我们构造一个使用事件的场景(是我以前面试时遇到的一个编程题)。具体场景大概是这样的:某工厂有个设备,当这个设备的温度达到90摄氏度时,触发警报器报警,同时发送短信通知相关工作人员。当时我就简单的构造3个类:设备(Equipment),警报器(Alert),短信装置(Message)。传统的实现方法:1. 警报器类(Alert)中编写一个报警的方法(StartAlert),短信装置类(Mes 阅读全文
posted @ 2011-07-11 15:06 wang_yb 阅读(854) 评论(0) 推荐(0)
摘要: 匿名类型使得C#更具动态性。而元组则是以前看python时就了解的一个类型,与List类型类似,只是它里面的元素是不可变的。主要内容:匿名类型介绍元组的介绍1. 匿名类型介绍匿名类型其实也像元组一样,定义了以后就不能更改里面元素的名称和个数。使用匿名类型的代码非常简单:using System;namespace cnblog_bowen{ public sealed class CLRviaCSharp_11 { static void Main(string[] args) { var v = new { Name="my name", Age=100 }; Conso 阅读全文
posted @ 2011-07-08 10:58 wang_yb 阅读(952) 评论(0) 推荐(0)
摘要: C#中也可以像动态语言那样,定义可选参数和可变数量参数。通过使用可选参数和可变数量参数可以构建更加灵活的函数。主要内容:可选参数可变数量参数1. 可选参数可选参数即调用函数时,传递参数的个数和顺序和定义的不一致。这样不用重载,也可以实现类似重载的多个版本的函数定义。示例代码如下:using System;namespace cnblog_bowen{ public class CLRviaCSharp_10 { static void Main(string[] args) { /* 输出结果 * i=1, s=Z, dt=00010101 00:00:00, g=00000000-0000- 阅读全文
posted @ 2011-07-04 15:53 wang_yb 阅读(910) 评论(0) 推荐(0)
摘要: 主要内容:扩展方法分部方法1. 扩展方法C#中的扩展方法实现起来非常简单,园子里也有很多写的很好的介绍扩展方法的文章。这里就不在举例说明扩展方法了,只记录一下在实现扩展方法时应注意的原则和规则。1)C#目前只支持扩展方法,不支持扩展属性,扩展事件等2)扩展方法必须在非泛型的静态类中声明3)定义扩展方法的静态类必须有文件作用域,即不能嵌套在某个类中4)多个静态类中如果包含相同的扩展方法,编译时出错(error CS0121)5)用扩展方法扩展了一个类型的同时,也扩展此类型的派生类型6)扩展方法有潜在的版本控制问题。 原因:类型在调用方法时,总是先找类型本身定义的方法,如果没找到对应的方法,再去找 阅读全文
posted @ 2011-07-01 10:19 wang_yb 阅读(668) 评论(0) 推荐(0)
摘要: 主要内容类型的转换构造器显式/隐式的转换操作符1. 类型的转换构造器类型转换构造器是指 通过一种类型(比如Type1)的实例来构造另一种类型(比如Type2)的实例。一般用于:1) Type1和Type2之间没有继承关系,但是仍然希望从Type1转换到Type22) Type1和Type2是完全不同的两种类型使用方法如下:using System;namespace cnblog_bowen{ public class CLRviaCSharp_8 { static void Main(string[] args) { Type1 t1 = new Type1(10); t1.Show(); 阅读全文
posted @ 2011-06-30 09:42 wang_yb 阅读(584) 评论(0) 推荐(1)
摘要: C#中经常用const或者readonly来定义不可改变常量,那么如何使用它们呢?主要内容:const和readonly的区别 readonly的补充说明 1. const和readonly的区别主要的区别在于 const是在编译时确定值的,readonly是在运行时确定值的。因此,用const修饰的字段,必须在定义的时候就赋值,否则编译器报错。而readonly修饰的字段除了可以在定义时赋值以外,还可以在构造函数中赋值。验证的代码如下:using System;namespace Test7{ public class CLRviaCSharp_7 { const string cValue 阅读全文
posted @ 2011-06-29 08:59 wang_yb 阅读(685) 评论(0) 推荐(2)
摘要: C#中调用一个函数时生成的IL代码有两种形式,分别为call 和 callvirt。主要内容call和callvirt的区别call和callvirt的例子1. call和callvirt的区别call的callvirt的区别主要有两点:1)call可以调用静态方法,实例方法和虚方法 callvirt只能调用实例方法和虚方法,不能调用静态方法2)call一般是以非虚的方式来调用函数的 callvirt是以已多态的方式来调用函数的2. call和callvirt的例子示例代码如下:using System;namespace Test6{ public class CLRviaCSharp_6 阅读全文
posted @ 2011-06-28 15:24 wang_yb 阅读(4062) 评论(0) 推荐(1)
摘要: 一直以为像C#这种内存自动回收的语言,开发人员无法操作其在内存的布局。现在才知道,CLR也提供了相应的接口,让我们可以更细粒度的对代码进行控制。主要内容C#中控制内存布局的Attribute模拟C#中的Union类型1. C#中控制内存布局的Attribute为了控制自己定义的类或结构在内存中的布局,CLR提供了System.Runtime.InteropServices.StructLayoutAtrribute这个Attribute。这个Attribute的构造器中提供了3种Layout:1)LayoutKind.Auto : 由CLR自动排列字段2)LayoutKind.Explicit 阅读全文
posted @ 2011-06-20 08:50 wang_yb 阅读(1011) 评论(0) 推荐(0)