C#
文章平均质量分 60
wangchongcy
IGT软件开发工程师
展开
-
WaitHandle——解决线程同步问题
WaitHandle及其子类提供了线程同步问题的解决方案,WaitHandle的类图如下:ManualResetEvent和AutoResetEvent都是在Signaled和Unsignaled两种状态之间切换,所不同的是当autoresetevent的waitone函数被调用后,其状态自动变为unsignaled。Mutex可以用来组成临界代码区,它的特点是可以跨进程。原创 2012-02-02 08:30:46 · 957 阅读 · 0 评论 -
线程间通信——数据传递和同步
线程间通信会产生两个问题:一个是如何传递数据,另一个是如何同步。1、线程间数据传递线程被创建后,我们无法利用线程的控制函数将数据从一个线程传递到另一个线程,然而,.NET本身的一个重要特性就是完全面向对象,即所有的函数都是放在类之中,因此,如果我们改变类成员变量的值,这种改变将会被附着在类函数上的线程看到。线程间通过资源(包括类成员变量)传递数据例如:下面的例子使用原创 2012-02-01 10:33:54 · 5622 阅读 · 1 评论 -
LINQ to Entity 动态查询
LINQ to Entity动态查询可以将查询条件写成一个字符串,然后由Entity Framework动态解析字符串构造成表达式树,完成查询,下面是几个应用。1、字符串条件字符串条件可以直接将比较字符串放入双引号中进行比较,例如:builder.Append("it.RegisteredPerson = \"" + PersonTextBox.Text + "\"");2、时间条原创 2012-03-28 10:43:32 · 2324 阅读 · 0 评论 -
C#高级程序设计(八)——Lambda表达式
Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。 该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。 Lambda表达式的基本形式是:(explicitly-typed-parameter-list)原创 2012-08-28 16:25:18 · 804 阅读 · 0 评论 -
C#高级程序设计(十)——LINQ
LINQ统一了数据访问方式,它是程序语言与数据之间的桥梁。LINQ框架如图所示:它主要由三部分组成:语言扩展、LINQ构建块和提供程序集。对于如下代码:varquery = from book in SampleData.Bookswhere book.Title == "Funny Stories"orderby book.Titleselect new {book.原创 2012-08-28 17:16:35 · 751 阅读 · 0 评论 -
C#高级程序设计(一)——从接口到代理到匿名方法到lambda表达式
问题背景:使用Sort方法对Product对象进行排序。下面是Sort方法的两个签名:public void Sort(Comparison comparison);public void Sort(IComparer comparer);其中一个是接收实现了IComparer接口的对象,另一种是接收Comparison代理。一、使用接口对象class Product原创 2012-08-14 13:19:10 · 1604 阅读 · 0 评论 -
C#高级程序设计(三)——泛型
在C#引入泛型之前,如果一个类或者一个方法想要支持多种类型,它就不得不把相应的参数或者返回值定义为object类型,这就意味着代码在执行的过程中需要很多的转型,并不是说你的代码一定不要用到转型,但是转型确实会带来很多潜在的问题,因为它将本该属于编译时的类型检查延迟到了运行时,而且也会带来一定的性能问题(装箱和拆箱)。C#2引入了泛型,包括两种形式的泛型:泛型类型和泛型方法。下面说一下和泛型有关原创 2012-08-21 15:42:40 · 1114 阅读 · 0 评论 -
C#高级程序设计(四)——代理中的Method Group转换
在前面代理对象初始化中提到过Method Group特性,C#编译器能将method group隐式转换成其兼容的代理对象。例如: Feedback fbInstance = FeedbackToFile;method group是一组方法的名称,之所以被称为方法组,是因为方法具有重载的特性,每个方法名称都可能有若干的signature。例如: void MyMethod原创 2012-08-23 10:15:04 · 2994 阅读 · 0 评论 -
C#高级程序设计(五)——代理中的协变和逆变
将方法签名与代理类型匹配时,协变和逆变为您提供了一定程度的灵活性。协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。一、逆变对于下面的三个代理类型:delegate void EventHandler (object sender, EventArgs e)delegate void KeyPressEventHandler (o原创 2012-08-23 15:06:27 · 707 阅读 · 0 评论 -
C#高级程序设计(二)——代理基础
本质上讲,代理提供了方法的封装,它把方法以某种方式封装在一个代理对象里,通过代理对象来执行调用方法、移除或者添加代理对象等操作。从另一种意义上讲,你可以把代理类型看作单一方法的接口,代理对象看作实现了该接口的对象。代理对象基础:代理类型下面的代码定义了一个代理类型internal delegate void Feedback(Int32 value);C#编译器实际上将这个代理原创 2012-08-15 14:55:24 · 1261 阅读 · 0 评论 -
C#高级程序设计(六)——匿名方法
在 2.0 之前的C# 版本中,声明委托的唯一方法是使用命名方法。 C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。 不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。 有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。 您可使用匿名方法来忽略参数列表。 这意味着匿名方法可原创 2012-08-24 14:15:23 · 782 阅读 · 0 评论 -
C#高级程序设计(七)——迭代
.NET使用IEnumerator接口和IEnumerable接口(以及它们的泛型版本)实现迭代器模式,迭代是LINQ的核心。接口定义如下: public interface IEnumerable { IEnumerator GetEnumerator(); } public interface IEnumerator {原创 2012-08-27 15:09:03 · 969 阅读 · 0 评论 -
一致性控制——解决线程间数据传递问题
线程间数据传递会产生两个问题:1)竞争两个线程同时修改一个变量,后一个人的修改会覆盖前一个人的修改,这种情况叫做竞争。2)死锁当一个线程占用资源A而请求资源B,另一个线程占用资源B而请求资源A,两个线程都无法继续运行,这种情况叫做死锁。下面的方法用来解决线程间数据传递的问题(主要是竞争带来的问题,死锁主要依赖于编程技巧而不是编程技术来解决问题)。1、原子操作原创 2012-02-01 14:34:23 · 2070 阅读 · 0 评论 -
线程控制——更多线程控制方法
1、Sleep和InterruptSleep函数阻塞当前线程一定的时间。当时间到达后,操作系统在下一个时间片按照其调度算法继续调度执行。Interrupt函数唤醒处于WaitSleepJoin状态的线程。本质上,Interrupt函数向处于WaitSleepJoin状态的线程触发ThreadInterryptedException,如果该异常没有被处理则会继续向上抛出,如图:原创 2012-01-31 14:42:54 · 821 阅读 · 0 评论 -
线程控制——创建、启动及终止
1、创建线程Thread thread = new Thread(new ThreadStart(SortAscending));2、启动线程thread.Start();3、终止线程如果想要一个进程结束,一种方法是让线程的入口函数执行完毕,但是在很多情况你下这种方式并不足以满足应用程序的需求。1)Abort当Abort方法被调用,它会向要终止的线程触发原创 2012-01-31 14:13:43 · 823 阅读 · 0 评论 -
值类型的实例构造函数
关于值类型的实例构造函数有如下的一些规则: 1、值类型不能有无参数的实例构造函数,将发生编译错误,例如下面的代码将发生“Error 1 Structs cannot contain explicit parameterless constructors ”的编译错误。 struct TestStruct { int x; int y; public TestStruct() { x = 10; y原创 2009-07-23 12:50:00 · 1955 阅读 · 0 评论 -
new与override
子类不会继承基类的static函数,但是子类会继承基类的virtual和non virtual函数。 1、由于子类继承了基类的non virtual函数,如果子类认可基类的该方法,可以什么都不做的利用;如果子类认为基类的方法不妥可以进行修正,方法是用new关键字定义同样签名的方法(不使用关键字new会产生警告)。 2、由于子类继承了基类的virtual函数,virtual函数的目的与non原创 2009-07-27 17:27:00 · 710 阅读 · 1 评论 -
String与StringBuilder
String特性: 1、编译器将文本常量字符串放在托管模块的元数据中,然后在运行时使用一种称作字符串驻留(string interning)的机制来访问。 2、C#中不能用new操作符来创建String对象。例如: String str = new String("Hello"); 将产生编译错误。 正确的创建方式是: String str = "He原创 2009-07-27 17:27:00 · 883 阅读 · 1 评论 -
派生类不继承基类的static成员
我们可以1、在派生类中引用基类型的静态字段,2、通过派生类类型引用基类的静态字段,例如: public class Base { public static int test = 0; } public class Derived : Base { public void Method() { test = 100; } } public class Program { static void M原创 2009-07-27 17:25:00 · 3490 阅读 · 0 评论 -
接口
接口仅仅是一个包含着一组虚方法的抽象类型,其中每一个方法都有它们的名称、参数和返回值类型。注意接口也可以定义事件、无参数性以及含参属性,因为它们都只不过是映射到方法上的语法缩写而已。C#不允许在一个接口中定义任何的静态成员,也不允许接口中包含任何的实例字段或实例构造器。原创 2009-07-30 12:51:00 · 839 阅读 · 2 评论 -
CLR管理异常的方式
首先,CLR会去查找接受被抛出异常的捕获筛选器。接着,它会调用更低层次的堆栈的Finaly块(如果存在的话)来展开调用堆栈,最后,CLR才会执行匹配的Catch块中的代码以及其后的Finaly。原创 2009-08-11 14:24:00 · 515 阅读 · 0 评论 -
C#基本问题
一、编译为程序集编译C#源代码文件将得到程序集文件,例如:csc.exe /out:App.exe /t:exe App.cscsc.exe /out:App.dll /t:library App.exe一个程序集文件包含4部分:PE表头、CLR表头、元数据和IL代码。PE表头是Windows操作系统要求的标准信息;CLR表头专门用于那些需要CLR才能运行的模块;元数据实际上就是一原创 2009-07-06 12:54:00 · 567 阅读 · 0 评论 -
在环境变量中查找程序集
<br />CLR会到操作系统的DEVPATH环境变量里指定的路径找,这个环境变量一般在开发机器上设置,为了那些延迟签名的程序集提供一个全局共享的位置,不建议在部署的机器上设置,要让这个环境变量有效还得在配置文件里做如下设置:<configuration><runtime><developmentModedeveloperInstallation="true"/></runtime></configuration><br />为true的时候表示要在这个环境变量中找,为false的时候则忽略。原创 2010-11-10 14:50:00 · 556 阅读 · 0 评论 -
C#使用delegate异步执行方法
在另外一个线程执行一个函数有很多种方法,这里讨论的是使用delegate的BeginInvoke方法,它的好处是在另一个线程中调用了函数,而且不用花费太多的开销。下面是使用delegate异步执行方法的示例: class Program { static void Main(string[] args) { object syncObject = ne原创 2012-01-30 14:52:56 · 5895 阅读 · 0 评论 -
线程状态及其转换
线程对象使用ThreadState.属性指示线程状态。ThreadState是带flag特性的枚举类型对象,因此判断线程当前的状态必须用bitmask,作为一个特例,由于Running状态的bit码是0,因此,需要用如下方式判断线程是否处于运行状态:(myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) ==原创 2012-01-30 17:13:50 · 2571 阅读 · 0 评论 -
C#高级程序设计(九)——表达式树
表达式树的设计是基于"code as data"的思想,它把代码表示成树状的数据结构,树状结构中的每个节点都是一个表达式(这个表达式是一个广义的概念,并不是编程语言中所指的表达式语法),因此称为表达式树。表达式树的本质在于将代码组织在数据段,而不是代码段,这对于运行时更改代码是非常重要的。System.Linq.Expressions命名空间下含有很多类来表示不同的表达式,这些类都原创 2012-08-28 16:25:53 · 1927 阅读 · 0 评论