【整理】C#2.0特性之局部类、空属类型和静态类

局部类

    在没有局部类出现之前,我们采用下面方法定义类:

【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类Code
public class App
{
     
public void Foo()
     {
         
//【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类
     }

     
public void Bar()
     { 
         
//【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类
     }
 }

    有了局部类之后,可将上述类拆分成如下两个局部类

【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类Code
public partial class App
{
    
public void Foo()
    {
        
//【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类
    } 
}

public partial class App
{
    
public void Bar()
    {
        
//【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类
    }
}

    局部类型简介

    1.局部类型允许我们将一个类型(类、结构体或接口)分成多个部分,分别是现在几个不同的cs文件中

    2.局部类型实用于以下两种情况

       第一 类型特别大,不宜放在一个类中实现

       第二 一个类中的一部分代码是由自动工具生成的代码,不宜与我们编写的代码放到一起

    3.局部类型是一个纯语言层的编译处理,不影响任何执行机制,IL在编译时会自动将局部类合称为一个完整的类。

    局部类型的限制

    1.局部类型只适用于类、接口和结构体,不支持委托和枚举。

    2.同一个类型的各个部分都必须有修饰符partial

    3.使用局部类时,一个类的各个部分必须放在相同的命名空间

    4.一个类的各个部分必须被同时编译。换言之,就是C#不允许对一个类的各个部分单独编译。

    局部类型的几个注意点

    1.关键字partial只有和class、interface与struct放在一起的时候才有关键字的意义。因此partial的引入不会影响代码中现有的名称为partial的变量。

    2.局部类型的个数并非必须是两个或两个以上,也可以是单独一个,不过这样做没意义。

    3.局部类型的各个部分一般是放在不同的cs文件中的,但是C#也允许放在同一个cs文件中

    局部类上应用特性

    局部类的特性具有"累加"效应,举例如下:

    [Attr1,Attr2("Hello")]

    partial class A{......}

    [Attr3,Attr2("GoodBye")]

    partial class A{......}

    相当于如下代码:

    [Attr1,Attr2("Hello"),Attr3,Attr2("GoodBye")]

    class A{......}

    局部类上的访问修饰符

    1.一个类型各个部分上的访问保护修饰符必须维持一致

    2.如果一个类的某个部分上使用了abstract,那么这个类将被视为抽象类

    3.如果一个类的某个部分上使用了sealed,那么这个类将被视为密封类

    4.一个类的各个部分不能使用相互矛盾的修饰符,比如一个是abstract,一个是sealed

    局部类型的基类和接口

    1.一个类的各个部分的基类必须相同。因为C#不允许类的多重继承

    2.局部类型上的接口具有"累加"效应,换言之如下代码

    partial class A:IA,IB{...}

    partial class A:IC{...}

    partial class A:IA,IB{...}

    等价于

    class A:IA,IB,IC{...}

空属类型

    空属类型简介

    空属类型允许一个值类型具有"空值"意义,从而方便很多场合的运算,如数据库中的空字段。

    空属类型本身就是一个值类型

    空属类型演示:

    int i = 123;

    int? x = i; //等价于System.Nullable<int> x = new System.Nullable<int>(i);

    double? y = x;

    int? z = (int?)y;//空属类型支持强制转换

 

    int? x = null;//同下面是不一样的,注意一下就是了

    object obj=null;//表示obj不指向托管堆的任何内存空间,ojb的引用指针为0,即无效指针。

    空属类型四则运算

【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类Code
using System;
using System.Collections.Generic;
using System.Text;

namespace Demo2
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
            
int? x = 123;
            
int? y = null;

            
//加法
            int? z0 = x + y;
            Console.WriteLine(
string.Format("x+y={0}", z0));

            
//减法
            int? z1 = x - y;
            Console.WriteLine(
string.Format("x-y={0}", z1));

            
//乘法
            int? z2 = x * y;
            Console.WriteLine(
string.Format("x*y={0}", z2));

            
//除法
            int? z3 = x / y;
            Console.WriteLine(
string.Format("x/y={0}", z3));

            Console.Read();
        }
    }
}

    运算结果

【整理】C#2.0特性之局部类、空属类型和静态类

    值类型与空属类型下Equals的特点

【整理】C#2.0特性之局部类、空属类型和静态类【整理】C#2.0特性之局部类、空属类型和静态类Code
using System;
using System.Collections.Generic;
using System.Text;

namespace Demo2
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
int i = 10;
            
int? x = 10;

            
//x.Equals(i)的时候其中的i做了隐式转换
            
//等价于x.Equals(new System.Nullable<int>(i))
            Console.WriteLine(x.Equals(i));
            Console.Read();
        }
    }
}

    演示结果

【整理】C#2.0特性之局部类、空属类型和静态类

    空属类型的几个注意点

    1.空属类型实际上是一个泛型类型System.Nullable<T>。空属类型的基础类型就是泛型类型System.Nullable<T>中的T,其中T必须为值类型

    2.空属类型如果值不为空,可以使用同基础类型相同的运算,如加、减、乘和除操作

    3.空属类型的HasValue用来判断空属类型是否为空,如果不为空,则可以通过Value属性获取它的基础类型的值。

静态类

     静态类简介

     静态类是只包含静态成员的类型,它既不能实例化,也不能被继承。它相当于一个sealed abstract类

     静态类演示

     static class MyUtility

     {

         public const int data;

         public static void Main()

         {...}

     }

     静态类的几个注意点

     静态类不能有实例构造器。

     静态类不能有实例成员。

     静态类上不能使用sealed和abstract关键字。

     静态类默认继承自System.Object类,不能显式的指定任何其他基类。

     静态类不能指定任何借口实现。

     静态类的成员不能有protected或protected internal访问修饰符。

转载于:https://www.cnblogs.com/jewleo/archive/2009/06/08/06081808_1.html