补充C#基础1

来源:互联网 发布:欧阳娜娜 黑料 知乎 编辑:程序博客网 时间:2024/05/22 14:15

《c#与.net3.0高级程序设计》

3.5设置成员的可见性
public:
private:
protected:不能从对象访问,可以从定义它的类中或者是这个类的派生类中访问。
internal:同一个程序集的任意类型都是可以访问,但不能被程序集以外的类型访问。
protected internal:6∩7

设置类型可见性
类型(类,接口,结构,枚举,委托)只能使用public和internal
public:
internal:只能在定义它的程序集中使用。

成员变量的初始化语法
C#允许在声明的时候给类型的成员数据赋初始化值。

常量数据:
class Person
{
 pubic const string name = "BaoBao";
}
赋给常量的值必须在编译时就确定,常量字段隐含为静态的。所以可以用Person.name来访问。

只读字段:
class Person
{
 public readonly string name;
}
只读字段允许建立在编译时不知道值的数据,但是一旦赋值,就永远不能被改变。
只读字段可以在构造函数的作用域内赋值。、
只读字段不隐含为静态的,需要加static关键字来实现Person.name的访问。
class Person
{
 public static readonly string name;
}

静态方法只能调用静态数据,但是非静态方法可以调用静态的和非静态的数据。
静态数据只分配一次,并在所有的同类型的对象实例之间共享。
定义了非静态数据,每一个对象都保存着字段的一份私有副本。

静态构造函数:
一个给定的类(或是结构)只能定义一个静态构造函数。
静态构造函数只能执行一次,与创建了多少个这种类型的对象无关。
静态构造函数不带访问修饰符,也不带任何参数。
当静态构造函数创建这个类的实例时,或在调用者访问第一个静态成员之前,运行库会调用静态构造函数。
静态构造函数在任何实例级别的构造函数之前执行。


静态类:
只能包含静态的成员或是字段。

参数修饰符:
无:按值传递。调用的方法收到的是原始数据的一个副本。如果按值传递引用类型(复制了指向调用者对象的引用),被调用者可以改变对象的状态数据,但是不能把引用赋值给一个新的对象。
out:按引用传递。不需要在他们被传递方法之前初始化,所以方法退出之前必须给输出参数赋值。
params:
ref:如果按引用传递引用类型,被调用者可以改变对象的状态数据和所引用的对象。


值类型与引用类型:
值类型:分配在栈上,值类型一旦离开其定义的作用域,就立即从内存中删除。
引用类型:分配在托管堆上,这些对象一直保留在内存中,直到.net垃圾回收器将它们销毁。默认情况下,一个引用类型的赋值将产生一个对该堆上同一个对象的新引用。

装箱和拆箱
当将自定义的结构或枚举传递给原型中带有System.Object参数的方法时,也会发生,装箱操作,在拆箱这个类型之前,将不能访问这个结构(或枚举)的任何成员。

枚举:
在后台,枚举的每个项目的存储类型默认映射到一个System.Int32,可以更改这个设置:
enum EmpType : byte
{
 Manger = 10;
 Grunt = 1;
 VP =9;
}

 

 

//2009年6月28日  15:37:46

对象的生命周期
CAR refcar  = new CAR();
在托管堆上创建一个新的CAR对象,返回指向这个对象的引用,此引用保存在栈上。

垃圾回收法则:
1、如果托管堆上没有足够的内存来分配所请求的对象,就会进行垃圾回收。
2、重写Finalize()的唯一理由:c#类通过PInvoke或复杂的COM互操作性任务使用了非托管资源。
 结构类型重写Finalize()不合法,因为是值类型,从来不分配在堆上。
3、如果对象支持IDisposalbe,总是要对任何直接创建的对象调用Dispose()。应该认为,如果设计者选择支持Dispose()方法,这个类必须要执行清除工作。
 if (rw is IDisposable)
  rw.Dispose();
 当退出using作用域时,自动调用Dispose():
  using(MyResoure rw = new MyResource)
   {//使用rw对象}

结构化异常处理
自定义异常需要:
1、继承自Exception/ApplicationException类
2、打上System.Serializable特性标志
3、定义一个默认的构造函数
4、定义一个设定继承的Message属性的构造函数
5、定义一个处理"内部异常"的构造函数
6、定义一个处理类型序列化的构造函数


第七章 接口
public class AnotherClass : BaseClass,Interface
 {}
最直接的基类是在冒号后面的第一个成员,结构总是派生自?System.ValueType,仅需在结构定义后面列出接口即可。

判断指定类是否支持一个接口:
 as is
Hexagon hexz = new Hexagon();

IPointy itptz = hexz as IPointy;
if(itptz != null)
 {}

if(hex2 is IPointy)
 {}

显示接口实现:

Operater关键字只能和静态方法联合使用。
1、同一个类型中定义显示和隐式函数是非法的。
2、当一个类型定义了隐式转换例程后,调用方使用显式转换时合法的。

处理程序中的溢出或下溢情况的有两种办法:
1、首选是手工处理所有的溢出条件。
2、checked

设定项目级溢出检查:
启用/checked后,所有算法计算溢出而不必使用checked关键字。
unchecked用于允许溢出的一个代码段。

指针类型
1、要绕过CLR管理直接操作指针以优化应用程序的特定部分
2、要调用基于c的*.dll或调用需要指针作为参数的COM服务器。

启用/unsafe

不安全上下文中,可以直接调用栈分配内存的局部变量。
unsafe
 {
  char* p = stackalloc char[256];
  for (int k=0; k<256; k++)
   p[k] = (char)k;
 }
fixed语句设置指向托管类型的指针并在执行过程中固定该变量。
Point pt = new Point();//Point是个类
fixed(int* p = @pt.x)
{
 //使用int*变量
}
//pt现在未被固定,可以被GC清除。

任何时候在不安全代码上下文之中与应用类型交互都要固定该引用。

sizeof用来获取值类型的字节大小,仅可被用于不安全上下文。

预处理指令:
 #region,#endregion:标记源代码区块。
 #define,#undef:定义或取消定义条件编译符。
 #if,#elif,#else,#endif:用来基于指定编译符号有条件的略过源代码区块。