在现在的开发过程中为了减少单个文件的代码量,降低协同开发时文件被独占锁定的几率,我们经常会使用扩展方法。扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

  随着DLR的广泛使用,面临越来越多需要C#代码和脚本语言交互的需求。(如果你知道如何使用,建议去DLR的官方网站去看看)但是,对于扩展方法来说如果直接使用会有发现DLR无法查找到指定的方法。

 

 Foo方法是一个扩展方法,虽然你可以不经雕琢的使用import方法导入你的DLL和类型定义,但是DLR引擎无法识别Foo方法,会引发AttributeError错误。为了解决这个问题,需要使用 Microsoft.Scripting.Runtime.ExtensionType扩展标识。

Code

构造器 第一个参数是你扩展的目标类型,第二个参数是实现扩展方法的类。

 

 

posted @ 2009-04-24 18:45 大约在冬季 阅读(984) 评论(2) 编辑
在MSDN介绍LINQ的时候,在开篇的时候介绍了如何使用LINQ,并使用以下代码举例:
 1class StartWithLINQ {
 2        static int[] numbers = new Int32[70123456 };
 3        public StartWithLINQ() {
 4            var numberQuery =
 5                from x in numbers
 6                where (x % 2== 0
 7                select x;
 8            foreach (int item in numberQuery) {
 9                Console.WriteLine("x = {0}", item);
10            }

11        }

12    }
首先创建了一个数组,包含7个成员,接着在从这个序列中筛选出所有能被2整除的元素并输出。OK,初次使用的时候还是有些不太适应这个语法,感觉怪怪的。想象一下,如果我们不用LINQ,我们的做法可能会少有不同,我们会自己去Foreach这个数组,判断后输出。代码量和现在的也没有什么太大差异。
下面来看看F#的同样功能实现吧,呵呵!

Code(F#)
上面的代码是一段脚本。首先定义一个序列,看看人家定义序列的简便语法,爽歪歪!接着使用流水线操作符,并结合Seq模块提供的筛选器,在筛选器中我们又使用了匿名方法来对数据进行筛选,生成新序列并输出,一气呵成!

以前看到关于函数式编程的资料,说如何的提高开发效率降低代码量,我还持怀疑态度,哎!不服不行啊。F#支持安全的多线程操作和并发多核心处理器优势,也许我们在一些关键组件上可以使用这些技术来提高我们的生产效率和软件的稳定性。目前来看,F#的应用领域可能更多的在数据密集型和逻辑复杂的业务处理,在服务端的优势在于线程安全和并发优势。(据说,F#的核心开发Leader是为.Net 2.0设计泛型的)
以上是本人的拙见,还希望能和大家共同学习探讨。
posted @ 2008-06-18 13:36 大约在冬季 阅读(817) 评论(5) 编辑
posted @ 2008-03-15 16:39 大约在冬季 阅读(119) 评论(2) 编辑
     以前曾经动笔写过一片《字符串比较方法的性能对比》的文章,很多朋友提出了非常好的意见和建议。碰巧最近看到好多人在这样比较字符串
if (string.Compare(keyState, "M"true, CultureInfo.InvariantCulture) == 0) {
似乎很有意思,大家都喜欢另辟蹊径的使用字符串比较,为了较为客观的反应各种字符串比较的优势,我特地做了一个本地测试,分别区分字符串长度一致以及长度不一致的情况,另外每种情况下还对字符串的比较方式上使用4种不同方法:
1、使用地球人都知道的“==”比较运算符
2、使用String.Compare方法,即上面提到的代码
3、使用string.Equals(string,StringComparison.Ordinal)方法
4、使用string.Equals(a, b, StringComparison.OrdinalIgnoreCase)方法
当然第三种方法是在不区分大小写和语言区域的情况下,每次进行1K万次比较。首先来看第一种场景,即字符串长度一致,但是内容不一致的情况。
使用比较的字符串用例为:
 string a = "abcdefghigklmnopqrstuvwxyz0123457689";
 string b = "abcdefghigklmnopqrstuv0123wxyz457689";

1、“==” :0.3239秒
2、使用String.Compare方法:1.8457秒
3、使用string.Equals(a, b, StringComparison.OrdinalIgnoreCase)方法 :1.6891秒
4、使用a.Equals(b, StringComparison.OrdinalIgnoreCase)方法 :1.6764秒

使用比较的字符串用例为:
 string a = "abcdefghigklmnopqrstuvwxyz0123457689字符串比较方法";
 string b = "abcdefghigklmnopqrstuvwxyz0123457689字符比较方法";

1、“==” :0.1766秒
2、使用String.Compare方法:.3.1811秒
3、使用string.Equals(a, b, StringComparison.OrdinalIgnoreCase)方法 :0.1093秒
4、使用a.Equals(b, StringComparison.OrdinalIgnoreCase)方法 :0.1112秒
比较的示例代码如下:
1 Stopwatch watch = new Stopwatch();
2             watch.Start();
3             for (int i = 0; i < 10000000; i++) {
4                 int r = String.Compare(a, b, true, CultureInfo.InvariantCulture);
5             }
6             watch.Stop();
7             double time;
8             time = watch.Elapsed.TotalSeconds;
9             Console.WriteLine("String.Compare  costs  {0}", time);
从比较的结果来看,使用最常用的“==”判断还是很有优势的,至少在各方面可以找到一个平衡点。在第二个场景中之所以第3、4测试方法比直接用“==”判断快的原因是,测试方法3,4首先检查了字符串的长度,如下代码:
 1 case StringComparison.OrdinalIgnoreCase:
 2             if (a.Length != b.Length)
 3             {
 4                 return false;
 5             }
 6             if (a.IsAscii() && b.IsAscii())
 7             {
 8                 return (nativeCompareOrdinal(a, b, true== 0);
 9             }
10             return (TextInfo.CompareOrdinalIgnoreCase(a, b) == 0);
11 
虽然有的书籍中介绍第4中方法会很快,但是至少从实际测试上来看却不是这样。此外,在进行WCF的WebService1.0的测试中并没有向微软宣称的那样比不是用WCF速度和性能上有明显的提升,只不过是旗鼓相当。不知道后续会有什么进展。
posted @ 2008-02-26 17:07 大约在冬季 阅读(2422) 评论(3) 编辑
声明,不是替DevExpress的控件做广告!虽然她的控件真的漂亮。
DevExpress 的 TreeList 控件不仅具备普通树状UI,而且还支持以表格方式呈现,就像Windows的资源管理器一样,可以很好的展示上下层模块之间的关系以及各个模块的属性。有时在单元格中可以使用CustomRepositoryItem控件,例如RepositoryItemCheckBox就是一例,不仅如此还需要在这个自定义控件旁边显示文本。
1、设置RepositoryItemCheckBox的Caption属性,设置Caption不同的属性将引发PropertyChanged事件
2、设置RepositoryItemCheckBox的GlyphAlignment属性,因为此属性默认是Center,所以无论你怎样设置Caption属性,文字始终不会出来。(郁闷了好久)
另外,在焦点选取产生的样式上可以设置FullFocusRect属性,如下图所示,前一种是设置为true时产生的效果。

posted @ 2008-02-26 14:33 大约在冬季 阅读(597) 评论(1) 编辑
新浪财经讯 在多重利空的冲击下,今日沪深两市继续走弱,沪指开盘后即快速下挫,两次跳水后略有回升,但是随后再度杀跌,最低跌至4241.02点。盘面观察,受中国联通(10.92,-1.21,-9.98%,)再融资传闻的影响,权重股延续弱势,中石油、中煤能源(19.98,-1.34,-6.29%,)中国太保(33.05,-1.19,-3.48%,)创出新低,中国人寿(35.70,-2.17,-5.73%,)跌破上市首日价。

  2月25日,沪综指开于4370.19点,最高4391.33点,最低4240.62点,午盘报于4241.02点,下跌129.27点,跌幅2.96%,成交额484.45亿元;深成指今开盘16201.54点,最高16304.23点,最低15706.87点,午盘收于15710.07点,下跌469.46点,跌幅2.90%,成交额219.52亿元。

  今日市场受到多重利空的冲击:央行表示紧缩政策不动摇;中国铁建今日实施网上申购,对二级市场资金面构成冲击;外资企业发行A股进一步明确,引发市场扩容压力。

  另一个冲击市场的因素就是“中国联通再融资事件”传闻,近期,中国平安(66.71,-2.71,-3.90%,)浦发银行(39.40,-0.58,-1.45%,)以及中国联通等权重股的融资方案频频震动近期的市场,给市场投资情绪带来了较强的打击。
以上是新浪财经的消息。

现在就看4195点位置了。看看能不能到3800点。另有传闻,注意仅仅是传闻。证监会将从3月1日起单边征收印花税。什么都有可能,o(∩_∩)o...

posted @ 2008-02-25 12:04 大约在冬季 阅读(50) 评论(1) 编辑
posted @ 2008-02-23 21:54 大约在冬季 阅读(1593) 评论(7) 编辑
摘要: 算术运算F#中的基本数据类型和C#中的简单类型非常相似,例如 doule对应了CLR中的System.Double类型。需要注意的是在F#中有三个数据类型:bigint,bignum以及unit。bigint是任意的大整数等同于Math.BigInt,使用的时候需要在数值后加上“I”后缀。bignum是任意精度的有理数,等同于Math.BigNum类型。使用的时候需要在数值...阅读全文
posted @ 2008-02-22 13:25 大约在冬季 阅读(280) 评论(1) 编辑
摘要: 新浪财经讯 因下周一中国铁建开始接受申购,令市场资金面紧张,加上周末调控预期抬头,以及前一日美股下跌、周边市场早盘低开影响,沪深两市22日早盘小幅低开,但其后便大幅下挫,银行、券商等权重指标股的下挫对股指形成较大拖累,沪指半日破4500点和4400点两个整数关口,并在盘中再次大幅击穿年线4466点,午盘大跌135点,跌幅2.99%。个股普跌,成交量比前一交易日有所放大。  对于早盘的如此走势,业内...阅读全文
posted @ 2008-02-22 13:16 大约在冬季 阅读(27) 评论(0) 编辑
posted @ 2008-02-21 13:07 大约在冬季 阅读(412) 评论(0)  编辑