C#
zenolee
这个作者很懒,什么都没留下…
展开
-
C#中的装箱(boxing)拆箱(unboxing) (续)
装箱操作:1.从托管堆中分配好内存。分配的内存是值类型的各个字段所需要的内存量加上同步块和方法表指针所需的内存量2.值类型的字段复制到新分配的堆内存中。3.返回对象的地址,这个地址是是一个对象的引用,值类型是一个引用类型。拆箱操作:1.检查装箱引用,如果为Null,抛出NullReferenceExxeption异常。2. 根据显示类型转换过程中的声明,来检查装箱对象的类型原创 2008-01-23 11:17:00 · 585 阅读 · 1 评论 -
抽象类(abstract),虚方法(virtual),接口(interface)对比分析(二)
接口和抽象类的区别:1.类是对对象的抽象,可以抽象类理解为把类当作对象,抽象成的类。接口只是一个行为的规范和规定。接口描述的是我能做(can-do),抽象类更多的定义在一系列紧密相关的类间(Is-a),二接口大多数是关系疏松但都实现某一功能的类;2.接口基本不具备继承的任何具体特点,它仅仅承诺了能够调用的方法; 3.一个类一次可以实现若干个接口,但是只能扩展一个父类;4.抽象类实现了oop中的一个原创 2008-01-29 11:39:00 · 955 阅读 · 1 评论 -
抽象类(abstract),虚方法(virtual),接口(interface)对比分析(三)
接口和抽象类1.抽象类用于部分实现一个类,再由用户按需求对其进行不同的的扩展和完善;接口只是定义一个行为的规范和规定。2.抽象类在组建的所有实现间提供通用的已实现功能;接口创建在大范围全异对象间是实用的功能。3.抽象类主要用于关系密切的对象;接口适合为不相关的类提供通用功能。4.抽象类主要用于设计大的功能单元;而接口用于小而简练的功能块。原创 2008-01-29 11:40:00 · 406 阅读 · 0 评论 -
抽象类(abstract),虚方法(virtual),接口(interface)对比分析(四)
用abstract,virtual ,interface三种方法做同一个例子virtual:using System;using System.Collections.Generic;using System.Text;namespace Test...{ class Employee ...{ protected string _name; p原创 2008-01-29 11:47:00 · 518 阅读 · 0 评论 -
final, finally, finalize的区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 finally—再异常处理时原创 2008-01-25 12:27:00 · 370 阅读 · 0 评论 -
Finalize 方法和析构函数
这个方法没怎么看懂,只能借用msdn的解释:对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。但是,在您创建封装非托管资源的对象时,当您在应用程序中使用完这些非托管资源之后,您必须显式地释放它们。最常见的一类非托管资源就是包装操作系统资源的对象,例如文件、窗口或网络连接。虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但原创 2008-01-25 12:33:00 · 793 阅读 · 0 评论 -
接口(interface)和接口的注意事项
接口定义了一个类和结构实现的协定。可包含方法、属性、时间和索引器。接口不提供它所定义的成员的实现--它仅指定实现该接口的类或结构必须提供的的成员。注意事项:1.一个接口可以声明零个或多个成员。2.接口不包括常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。3.所有的接口成员都隐式地具有public访问属性。4.接口成员声明中包含任何修饰符属于原创 2008-01-27 11:42:00 · 536 阅读 · 0 评论 -
事件(event)设计准则(一)
.Net Framework事件设计准则:1.事件的命名准则应实用PascalCasing命名方式。(如EventName)2.声明delegate时,实用void当作返回值,EventName事件的事件委托是EventNameEventHandler,事件接受两个传入参数,一律名为sender和e。3.定义一个提供事件数据的类,对类以EventNameEventArgs进行命名,从System.原创 2008-02-02 10:53:00 · 697 阅读 · 0 评论 -
事件(event)定义及步骤
事件(event):事件是在发生其关注的事情时用来提供的通知的一种方式。例如,封装用户界面控制的类可以定义一个在用户单机该控件时发生的事情。控件类不关心单击时发生了什么,但它需要告知派生类单击事件已经发生,派生类可以选择如何响应。事件包括:事件发行者(Publisher):一个事件发行者(sender),其实就是一个对象,这个对象会自动维护本身的状态信息。当本身状态变动时,便出发一个事件,并通原创 2008-02-02 10:52:00 · 1755 阅读 · 0 评论 -
事件(event)设计准则(二)
class PubEventArgs : EventArgs ...{ private readonly string m_magazineName; private readonly DateTime m_pubDate; public PubEventArgs(string magazineName, DateTime pubDate)原创 2008-02-02 10:55:00 · 626 阅读 · 0 评论 -
C#基础概念二十五问
C#基础概念二十五问 注:本文部份资料来自网络,如有侵权,请与我联系,我会在第一时间声明引用或将其删除! 当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题:1.静态成员和非静态成员的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstr转载 2008-02-22 11:55:00 · 417 阅读 · 0 评论 -
索引器与数组的比较
索引器与数组的比较:1.索引器的索引值不(index)类型不受限为整数:用来访问数组的索引器,其类型只能是整数,索引器可以为其他类型。2.索引器允许重载(Overloading):一个类并不限制只能定义一个索引器,只要索引器函数签名不同,一个类可以拥有很多个索引器,可以重载他的功能。3.索引器不是一个变量:索引器并没有直接对应应用数据存储的地方,而数组则有。索引器有get和set访问器,用来读原创 2008-03-07 22:57:00 · 703 阅读 · 0 评论 -
抽象类(abstract),虚方法(virtual),接口(interface)对比分析(一)
抽象方法和虚方法的区别:1.虚方法有一个实现部分,并为派生类提供了覆盖该方法的选项,相反,抽象方法没有提供实现部分,强制派生类覆盖方法(否则派生类不能成为具体类);2.abstract只能再抽象类中声明,虚方法不是;3.abstract方法必须在派生类中重写,virtual不必;4.abstract不能声明方法实体,virtual可以;5.包含abstract方法的类不能被实例化,包含virtua原创 2008-01-29 11:39:00 · 538 阅读 · 0 评论 -
接口直观隐藏规则
namespace Test...{ interface IA ...{ void F(); } interface IB : IA ...{ new void F(); } interface IC : IA ...{ new void G(); } interface IBC : IB,原创 2008-01-29 09:40:00 · 371 阅读 · 0 评论 -
方法(method)及输出参数和引用参数的方法区别
方法是一系列的代码块,它实现了一定功能的,并拥有一个便于识别的名称,也便于在程序中调用。Method(parameter){内容}共享变量:如果两个以上的方法一个变量就要把变量声明在类阶层,和局部变量不同的是类级别变量的声明周期是在此类加载到内存时就会自动地分配内存空间,要等到此对象被Commond Language Runtime的垃圾回收器(Garbage Collect)回收时,才会原创 2008-01-28 11:55:00 · 650 阅读 · 0 评论 -
C#中的装箱(boxing)拆箱(unboxing)
在.net中的通用类型系统(Common Type system,CTS)中,所有类型都是对象(object),都派生自System.Object。CTS支持两组类型:值类型和引用类型。如果变量是 值类型那么这个变量就包含实际的数据。也就是在内存中确实会分配那么一部分空间给这个变量并存储值,引用类型就类似一个类型安全的指针,本身并没有开辟内 存空间去存储东西。这玩意是基础,罗嗦的重复一原创 2008-01-22 12:46:00 · 387 阅读 · 0 评论 -
访问控制修饰符(access modifiers)
找了一个访问控制修饰符的图原创 2008-01-22 13:06:00 · 681 阅读 · 0 评论 -
抽象类(abstract)
关于抽象类的一些总结:1.抽象类不能被实例化;2.抽象类可以包含抽象方法和抽象访问器,但不能定义具体的方法和访问器,只能在继承的非抽象类里定义;3. 不能用sealed修饰符修饰抽象类;4。从抽象类派生的非抽象类必须包含继承的的所有抽象方法和抽象访问器的实现。原创 2008-01-24 22:18:00 · 337 阅读 · 0 评论 -
抽象类(abstract)和虚方法(virtual)的区别
抽象方法和虚方法的区别:1.虚方法有一个实现部分,并为派生类提供该方法的选项,抽象方法没有提供实现部分,强制派生类覆盖方法(否则派生类不能成为具体类)2.abstract方法只能在抽象类中声明,虚方法不行;3.abstract方法必须在派生类中重写,而virtual不必;4.abstract方法不能声明实体,virtual可以。5.包含抽象方法的类不能实例化,而包含virtua原创 2008-01-24 23:01:00 · 717 阅读 · 0 评论 -
虚方法(virtual)
virtual的定义:virtual用于修饰方法、属性、索引器、或事件声明,并且允许在派生类中重写这些对象。一般虚方法用virtual和override关键字,在主方法中用virtual表示虚方法,在子类中用override表示覆盖父类中的需方法,即表示对虚方法的重写。多态(polymorphism):两个或多个属于不同类的对象,对同一个消息做出不同的相应的能力原创 2008-01-25 10:22:00 · 594 阅读 · 0 评论 -
析构函数(destructor)
1.析构器和构造器很一样,都是用类名作为方法名,只是析构在类名前加~; 2.一个类只有一个析构器;3.析构器不能不继承和重载;4.析构器不能被调用,它是被自动调用的;5.析构器不能带修饰和参数,即析构器永远都是私有的(privated)原创 2008-01-25 12:24:00 · 429 阅读 · 0 评论 -
值类型和引用类型
类型区分为这两大类的主要原因是在与执行性能与内存管理的不同。由于值类型变量直接在堆栈(stack)中存储该类型的值,此类型在内存的实用上以及访问效能上要比引用类型上要更好。因为引用类型变量存放的是指向实际对象的指针,因此访问内存时必须多进行一次内存引用的操作方可获取数据。且引用类型的对象必须分配多余的内存来存储虚函数指针及线程同步块。对于内存的需求较大。而实用引用类型的优点是回收站会自动替你管理分原创 2008-01-28 12:07:00 · 479 阅读 · 1 评论 -
值类型和引用类型(续)
原创 2008-01-28 12:28:00 · 278 阅读 · 0 评论 -
.net framework 垃圾回收机制
首先,让我们来了解下什么是垃圾回收机制。为了使程序员从跟踪内存使用的繁重任务中解脱出来,利用充分的时间去完成业务逻辑,因此产生了垃圾回收机制,虽然大多数的垃圾回收器都要求应用程序不停地暂停从而释放出不在使用的资源,但是.NET的垃圾回收器效率依然很高。垃圾回收器的基本思想: 寻找不再使用的对象,将他们从内存中删除,并压实托管堆以释放不在使用的对象所占用的内存。在堆被压实之后,转载 2008-01-25 11:34:00 · 504 阅读 · 0 评论 -
那些情况finalize发放会被调用
1.第0代对象充满;2.代码显式地调用System.GC的Collect方法;3. Windows报告内存不足;4.CLR卸载应用程序域;5.CLR被关闭。原创 2008-01-25 12:39:00 · 321 阅读 · 0 评论 -
显示接口成员实现(explicit interface member implementation)总结
为了实现接口,类或结构可以声明显示接口成员实现(explicit interface member implementation),显示节后成员实现就是一种方法、属性、事件或索引器声明,它实用完全限定接口成员作为标识符。接口成员有时也用它的完全限定名(fully qualified name)来引用。成员的完全限定名将引用声明该成员的接口。接口成员限定名的组成是:声明该成员的接口名字.该成原创 2008-01-27 12:17:00 · 990 阅读 · 0 评论 -
C#实现更改IP功能源代码
这是一个很好的源码,给大家一起分享一下。 mo.InvokeMethod("EnableStatic", iObj, null); iObj = mo.GetMethodParameters("SetGateways"); iObj["DefaultIPGateway"] = gateways; iObj["转载 2008-09-29 12:41:00 · 534 阅读 · 0 评论