
C#学习
todototry
这个作者很懒,什么都没留下…
展开
-
C#fixed关键字的作用
原则:1、垃圾回收机制,维护引用信息不维护指针信息2、引用类型的实例化对象在生存期内由垃圾回收机制处理,可能移动内存3、当一个类的实例化对象中含有值类型时,定义指向这些值类型的指针编译报error,因为这些内嵌在引用类型中的值类型实例会随着引用实例化对象的内存移动而移动,所以指针值在不知情的情况下会发生变化,fixed关键字做的工作便是让这样的类实例化对象(不是类类型本身,而是一个实例原创 2010-01-11 10:02:00 · 3951 阅读 · 0 评论 -
c#中使用多线程访问 winform中控件的若干问题
c#中使用多线程访问 winform中控件的若干问题2009-12-14 11:12我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。 首先来看传统方法: public partial class Form1 : Form { pu原创 2009-12-17 23:59:00 · 1085 阅读 · 0 评论 -
C#泛型概念
原则: 1、和C++的模板类似,C#的泛型本质就是类型的类型,它定义了一种类型,它的每个实例化对象是一种具体的类型,所以称之为类型的类型 2、它在实例化的时候分成两种情况:引用类型和值类型因为引用类型本质是指针,是内存的地址,所以一定位长的机器上,指针变量所用的字节数是一致的,如32位机使用4字节,泛型本质作为一种定义类型的类型,编译后会有一份二进制代码描述这个类型原创 2009-12-11 11:01:00 · 1960 阅读 · 2 评论 -
C#类可以自引用(建立在类是引用类型的基础上)
原则:1、C++的类类型是值类型,也就是说实例化个类对象的时候,内存分配在栈上。这样如果类类型这样定义的时候class A{ public: int i; A a;}就会陷入无限的死循环,因为实例化一个A的对象object的时候,A要根据成员类型去计算这样一个对象要占用的内存空间(数据成员根据类型确定,成员函数的代码存一份原创 2009-12-12 12:17:00 · 2275 阅读 · 1 评论 -
C#泛型提供的一定程度的安全性
原则:1、编译期间不知道是什么类型,在运行时确定,这是多态性的基础,所以用object这个最基类来做多态的父类型绝对合适但是因为编译期间不能确定实际使用类型,所以并不安全,而泛型可以提供一定程度上的类型安全检查,比如运行确定出的类首先要支持泛型才能通过编译,这就在编译的时候增加了一定程度的安全性原创 2009-12-10 15:28:00 · 955 阅读 · 0 评论 -
C#事件的引发与等待
原则:1、一段代码中引发了一个事件,那么所有注册了这个事件的对象,它们的事件处理程序都会执行起来,而且引发事件的这个类(发送器端)的执行会暂时停了,等待其他所有的类的事件处理程序完成之后再继续执行。 一个程序之中,几个对象之间如何传递交互信息,便是这样执行。 这个过程类似于C中的消息传递,一个模块(一段代码)发送一个消息sendmessage,这个消息由系统获知,其原创 2009-12-09 18:16:00 · 4399 阅读 · 0 评论 -
C#事件为空
原则:1、如果没有为事件写好事件处理程序,那么事件(也是个类,类对象)为空 2、前面所述的事件+=委托(事件处理程序)这种语法格式的语句,只是把事件和事件处理程序关联了起来,并且在这个时候,事件处理程序已经是肯定定义了,因为传入了事件处理程序的称,也就是说指明了事件发生时用哪个函数,这同时说明,这种关联是写在事件接收器的(一般用户编写代码都是在事件接收器,比如系统事件原创 2009-12-09 17:51:00 · 7164 阅读 · 0 评论 -
C#事件概念
原则:1、C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器;2、发送器不知道接收器的任何情况,但接收器有一个事件处理程序来处理这个事件(当事件发生时);那么发送器和接收器之间如何进行通信呢?用事件,用委托,简单地来理解把事件理解成消息即可。先定义个委托,要使用的事件处理程序的签名(也就是函数类型,返回值,参数个数,参数类型等等)由这个委托定义,委原创 2009-12-09 15:16:00 · 17206 阅读 · 1 评论 -
C#事件处理程序的写法
原则:1、sender是一个object定义类型,利用oo多态的功能,父类引用一个子类实例化对象完全可以,在执行的时候解析成个子类的对象,当然要调用子类扩展的成员时直接用sender不行,因为毕竟在形式上是父类类型,父类里面没有这样的成员,虽然它在实际上是一个子类的对象,这时候,强制类型转化,当子类用(实际在内存就是,当然安全)原创 2009-12-08 09:44:00 · 2134 阅读 · 0 评论 -
C#中构建多线程应用程序(1)
C#中构建多线程应用程序(1)2009-11-28 20:51 引言 随着双核、四核等多核处理器的推广,多核处理器或超线程单核处理器的计算机已很常见,基于多核处理的编程技术也开始受到程序员们普遍关注。这其中一个重要的方面就是构建多线程应用程序(因为不使用多线程的话,开发人员就不能充分发挥多核计算机的强大性能)。 本文针对的是构建基于单核计算机的多线程应原创 2009-12-17 17:34:00 · 1446 阅读 · 0 评论 -
C#中构建多线程应用程序 2
C#中构建多线程应用程序 22009-11-28 20:51 3.1.3线程同步 线程同步的访问方式也称为阻塞调用,即没有执行完任务不返回,线程被挂起。可以使用C#中的lock关键字,在此关键字范围类的代码都将是线程安全的。lock关键字需定义一个标记,线程进入锁定范围是必须获得这个标记。当锁定的是一个实例级对象的私有方法时使用方法本身所在对象的引用就可以了,将上面例原创 2009-12-17 18:52:00 · 1239 阅读 · 0 评论 -
C#类实例对象的内存内容本质
原则:1、一个类的实例化对象,存放了类的实例字段(即为数据成员)的数据;2、也存放了.net(os系统)用来识别和管理这个类实例化对象的信息3、方法(成员函数)并不存在在这里,它的存放有两种方法可行:》函数方法放在另外一个地方,记录上他们属于哪个类这样的信息;》也可以在每个类的实例对象中存储这个函数方法实际代码的地址值即可;方法一的可行性更高,设计效率更好原创 2010-01-08 12:31:00 · 2068 阅读 · 0 评论 -
C#扩展方法本质
原则:1、扩展方法是一个补丁的概念,在一个进程(一个程序集)的范围内,给某个类型临时加上方法。所以扩展方法不能写在嵌套类,应该在程序集的全局区,这个程序集的顶级类中。而且要求有二(在static类中,是一个static方法),this是它和一般的方法的区别符2、扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。3、两种使用方法:using S原创 2010-01-08 09:58:00 · 6359 阅读 · 0 评论 -
C#类的索引器的本质
原则:1、索引器的本质是一个方法,是一个函数,返回值是对象类型,用[]的语法形式来使用原创 2010-01-07 17:39:00 · 952 阅读 · 0 评论 -
C#线程安全对象的内部实现
原则:1、读写互斥操作某个数据对象,这在多线程中经常使用,可用lock实现安全的互斥访问 本质上,线程安全的对象其内部实现也是基于这种设计2、一个list,有get,set方法,需要get与set互斥访问: 设计一个类,具有数据成员list,get方法,set方法 类名为SecureList,在get和set方法的执行代码中操作list,代码置于lock原创 2010-01-07 09:39:00 · 5552 阅读 · 0 评论 -
C#集合只读效果的实现本质
原则: 1、普通集合的方法AsReadOnly返回值是一个集合的引用,但是只读属性,这用一个指向常量的指针(指针常量)很好理解,指针所指对象不一定是常量,但用这个指针(指针常量)去引用的时候,系统就认为是个常量,从而实现只读的效果原创 2010-01-05 21:37:00 · 3033 阅读 · 0 评论 -
C#事件处理流程
原则: 1、C#的事件驱动本质是对以前消息驱动的概念更新与升级消息驱动模型:发送方发送消息->操作系统维护消息->消息的接收方响应消息事件驱动模型:发送方引发事件->操作系统维护事件->事件的响应方处理事件在上面的模型中,发送方和接收方可以是同一个对象或者实例 2、C#事件的使用方法举例:环境描述为:在一段代码中,一个对象定义了一个事件,另外一个事件处理这个事件原创 2010-01-04 14:45:00 · 2028 阅读 · 1 评论 -
多线程
http://www.yesky.com/331/215831.shtml原创 2009-12-18 10:25:00 · 565 阅读 · 0 评论 -
C#委托与事件
http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.htmlhttp://www.cnblogs.com/JimmyZhang/archive/2008/08/22/1274342.html原创 2009-12-17 17:56:00 · 662 阅读 · 0 评论 -
C#委托的参数类型抗变
原则: 1、把派生类对象传给基类型的参数,这完全可以,多态性能够使得在程序运行的时候,基类型完整确认绑定到子类对象 2、p是个基类对象也可以执行,原因在于真正的代码Method2中处理的是它的参数基类对象的数据,所以不会出现基类没有的部分,所以使用的各个成员都是有意义的;派生类那就更没有问题了,因为派生类完整包含了基类,基类有的派生类的都有;但是反过来,Method2如果使用的是派原创 2009-12-07 22:27:00 · 951 阅读 · 0 评论 -
C#委托的基本用法
原则:1、委托本质就是个指针,一个函数指针,拿到函数的首地址即可;C#的委托加了安全性,体现在对于函数指针所引用的函数指令块的类型检测,比如返回值,参数类型,参数个数而C中的函数指针被赋值的时候(在C#中,就是委托实例化的时候,因为C#中后台将委托处理成一个类了,封装了哈)被赋予的值是否满足类型的种种条件(返回值,参数类型,参数个数)不做检查,由用户给出保证,C#会编译提示出来原创 2009-12-07 14:34:00 · 1189 阅读 · 0 评论 -
C#委托所蕴含的函数指针概念
原则: 1、函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用一个函数调用另一个函数的时候,就可以把被调用函数以函数指针的形式作为参数传入 2、回调函数callback使用的技术就是函数指针: 回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事: 1). 声明; 2)原创 2009-12-07 09:11:00 · 1596 阅读 · 0 评论 -
C#中类类型之间的显示转化定义
原则:1、必须定义在类的内部(源或者目的),这样的目的是不让第三方把数据类型转化引入到类中,这样只能执行用户所给出的类类型之间的数据转换2、执行类类型的转换需要两个没有派生关系的类之间,有派生关系的类之间系统给出隐式类型转换(向上转换,子类型转为父类型)3、两个类之间的类类型的转换,当然定义两个转换符,A到B时定义operator B;B到A时定义operator A;这两个转换符的实原创 2009-12-06 18:41:00 · 1132 阅读 · 0 评论 -
静态方法不能够进行重写
原则:1、静态具有全局的概念,不属于了单个的类实例化对象,而是属于类整体;类定义完成的时候,静态成员便可以使用了,继承类不能重写静态成员函数,假设重写了(当然仍是静态),那么就是说两个全局化的非重载的函数,会引起二义性,因为覆盖只发生在子类与父类之间,当全是静态成员的全局性质时,这种子父类的概念已经不存在了,所以就不会覆盖,造成编译的二义性两个同名而且不重载的函数(全局性质的),显而易原创 2009-12-06 13:59:00 · 8376 阅读 · 0 评论 -
C#数组变量的内存分配
原则:1、简单的值类型的数组,每个数组成员是一个引用(指针),引用到栈上的空间(因为值类型变量的内存分配在栈上)2、引用类型,类类型的数组,每个数组成员仍是一个引用(指针),引用到堆上的空间(因为类的实例的内存分配在堆上) class Person{} Person[] myPerson;myPerson = new Person[2];myPerson[0] =原创 2009-12-05 17:44:00 · 5136 阅读 · 1 评论 -
默认权限
原则: 1、C++中默认权限是public,而且可以成块地设置权限 2、C#中默认权限是private,只能一个成员一个成员(数据成员,成员函数,接口,属性)地设置 C#中public class A{ void fun(){} int i;} 等价于public class A{ private void fun(){原创 2009-12-04 16:45:00 · 700 阅读 · 0 评论 -
私有构造函数对子类构造的影响
原则: 1、原则就是原则,private成员,只有类本身才能使用,子类是不能使用的因为C#只有共有继承的概念C++有公有继承,保护继承,私有继承三种 2、C++的私有继承是可以使用父类的的私有数据成员和私有成员函数的 3、构造函数析构函数在C++和C#都是不能继承的。 class Base { privat原创 2009-12-04 16:42:00 · 807 阅读 · 0 评论 -
继承就是全部的包含,级别只说明访问权限
原则:1、子类继承父类,则拥有父类全部的成员,以及函数包括私有数据成员,只是子类不能访问而已2、 class Base { private int i; } class A : Base { public int j; } 这样一个A类实例化对象,原创 2009-12-04 15:29:00 · 596 阅读 · 0 评论 -
抽象函数与抽象类
原则: 1、抽象函数对应于C++中的纯虚函数,虚函数:是有具体实现,可以在子类中重写的函数纯虚函数(抽象函数):没有任何实现,在子类中必须的进行重写才能实例化(子类是抽象类时除外) 2、含有抽象函数的类,必然是抽象类假设能够实例化,那实例化的对象调用这个函数的时候,执行什么代码呢? 3、纯虚函数=0写法的改变从这个写法的改变,说明了C#中默认构造函数的功能不原创 2009-12-04 10:32:00 · 925 阅读 · 0 评论 -
重载可以发生在子父类
原则:1、继承来的成员函数就像自个定义的一样,所以能构成重载 class BaseClass { public void fun() { Console.WriteLine("base fun !"); } } class原创 2009-12-04 09:48:00 · 1493 阅读 · 0 评论 -
.和::
原则:1、C#中对于静态成员的引用也是用.不是用::2、C++中对于静态成员的引用是用::3、C#中::用在命名空间别名,叫命名空间别名限定符原创 2009-12-07 17:24:00 · 544 阅读 · 0 评论 -
构造函数执行,base与this关键字
原则:1、任何类的构造函数,一定要是public的,才能派生子类 class Base { private int i; public Base(int i) { this.i = i; Console.WriteLine("Ba原创 2009-12-04 16:59:00 · 1916 阅读 · 0 评论 -
C#要求运算符重载必须是public和static
原则:1、C#要求运算符重载必须是public和static,而且因为规定了必须是static,所以它是和类相关联而不是和类的实例化对象相关联所以只能访问类的静态成员因为类未实例化的时候,非静态成员还没有得到分配的内存,更不用说有具体的有意义的值了但这时候静态成员函数是可以执行的,假设能访问非静态数据成员,它访问的是一个无意义的值原创 2009-12-06 16:35:00 · 2220 阅读 · 0 评论 -
C#属性的基本用法
原则:1、属性是oop思想的语法形式的表现本质就是不能直接访问数据成员,而通过属性来访问,所以一般把数据成员设置成为private在C++同样的功能是提供public的成员函数来实现的,比如void set(){//...}和void get(){//...}两个成员函数来设置获取私有数据成员的值,只有这样的途径去改变数据成员的值,其他的方法是非法的,便于看到成员数据值改变的地方在原创 2009-12-06 16:26:00 · 748 阅读 · 0 评论 -
值类型使用ReferenceEquals方法
原则:1、ReferenceEquals方法用于变量的比较,如果是引用类型则比较两个引用是否引用到了相同的实例化对象;如果是值类型,则先装箱然后传入装箱后的参数,然后比较两个装箱的引用,可以说,比较值类型的时候,总是不同的即使 int i = 3;bool bIsSame = ReferenceEquals(i, i); 也是不一样的,因为这时后台这样处理,对于第一原创 2009-12-06 14:51:00 · 811 阅读 · 0 评论 -
C#的装箱与拆箱
原则:1、装箱:将值类型转化为引用类型方法:通过创建临时对象,由.net后台执行原因:在C#中值类型和引用类型存放的内存位置不同,所以转化的时候涉及到内存迁移,所以提供这样的技术来实现内存迁移 int i = 10;string s = i.ToString();这样是不行的,因为i是一个值类型,不能调用ToString方法 int i = 10;objec原创 2009-12-06 12:02:00 · 716 阅读 · 0 评论 -
C#可空类型概念
原则:1、可空类型有一个所依赖的基本类型,只是额外提供了功能,使得不能作为空值的该类型有了得到null值的功能例如: int ? a;a = null; 如果是int a;a = null; //这是不能赋值的语句 2、在引入可空类型之后,就需要对原本不存在的null运算作出规定,如int b = 3;b+a这样的表达式在a= null值时原创 2009-12-06 11:30:00 · 481 阅读 · 0 评论 -
C#迭代器的实现
原则: 1、迭代器的本质就是指针,指向对象的地址,一般就是以对象的引用出现常见的是一个函数返回一个对象的引用,这个对象的引用可以在数组,集合各个元素之间移动(本质就是指针的移动,移动sizeof(classType)个字节)在Think in C++中有迭代器的实现代码STL源码剖析也有描述 2、在C#中,只是出现了接口这样的纯函数类的概念,于是把这些返回引用的函数原创 2009-12-05 23:45:00 · 662 阅读 · 0 评论 -
C#的锯齿数组以及C++实现
原则:1、锯齿数组首先是二维数组,第一维的维数是确定的2、之所以在C#中能够出现灵活的锯齿数组,是因为,C#的数组是引用类型(本质上存放的是指针)根据这个引用类型(指针)的概念,C++中用指针数组同样可以实现 C#中:class A{} int szA[][] = new int[3][];szA[0] = new int[2];szA[1] = new i原创 2009-12-05 18:44:00 · 1809 阅读 · 0 评论 -
C#接口所蕴含的多态概念
原则:1、所谓多态,是指在程序运行的时候确定真正的对象类型使用方法,用一个父类的指针,可以指向所有的子类对象,在程序执行的时候,确定下来具体的哪一个子类,此后这个父类指针便具体化为相对应的子类的指针,去调用想对应的子类的所有可用资源class Base{}class A:public Base{ public: void fun(){cout原创 2009-12-04 21:37:00 · 860 阅读 · 0 评论