• [毕业生的商业软件开发之路]C#类型成员样式


     

    静态成员

    使用关键字“static”修饰的类型成员就是静态的,类型的字段、属性、方法、事件、构造函数都可以是静态的。例如在上面的PeopleClass中使用了以下代码定义了一个静态方法。

    public static int CalculateAge( DateTime birthday )

    {

        return DateTime.Now.Subtract(birthday).Days / 365;

    }

    这个静态方法就是能根据生日计算周岁数的。由于计算周岁是一个通用的算法,并不局限于某个特定的对象,因此可以将其定义为静态类。

    静态成员类型无需创建对象实例即可通过“类型名称.成员名”的方式调用。比如以下代码就能调用CalculateAge方法。

    DateTime dtm = new DateTime(1980, 2, 14);

    int age = PeopleClass.CalculateAge(dtm);

    对于静态类型,通过“实例变量.成员名”的方式反而不能调用,比如以下的代码是错误的。

    PeopleClass instance = new PeopleClass();

    DateTime dtm = new DateTime(1980, 2, 14);

    int age = instance.CalculateAge(dtm);

     

    注意调用静态成员C#和VB.NET语法有些差别。在VB.NET中,可以使用“派生的类型名称.成员名”来调用静态成员,但C#不支持。比如在类型A中定义了静态成员M,而从类型A之上派生了类型B,则在VB.NET中可以使用“A.M”或者“B.M”来调用静态成员,但在C#中不能用“B.M”这种写法。

    例如以下代码中定义了静态方法“Sum”和静态字段“Value”,

    public class MyClass

    {

        public static int Value = 100 ;

        public static int Sum(int a, int b)

        {

            return a + b;

        }

    }

    这样我们就可以使用“MyClass.Sum”来调用这个方法而无需创建对象实例。若还从这个类型派生了新类型,其代码如下

    public class OtherClass : MyClass

    {

    }

    则在C#中只能使用“MyClass.Sum”来调用这个静态方法,而在VB.NET中可以有“MyClass.Sum”和“OtherClass.Sum”两种方式来调用这个静态方法。

     

    静态字段

    对于静态字段,是可以赋值的,而且静态字段作用范围是整个程序,相当于全局变量,比如在任意地方修改了此处的静态变量“Value”的值后,其他地方获得的字段值就是修改后的值。

     

    静态构造函数

    被“static”修饰的无参数构造函数就是类型的静态构造函数,例如对于上面的PeopleClass类型中就使用了以下代码定义了一个静态构造函数。

    static PeopleClass()

    {

        System.Console.WriteLine("Start");

    }

    在程序加载的时候,若程序没有调用PeopleClass中的成员,静态构造函数不会被调用,甚至使用typeof操作也不会调用;但程序中第一次引用了类型的某个成员或者创建了对象实例前,系统会自动的调用一次类型的静态构造函数,而且整个软件运行期间,某个类型的静态构造函数只可能调用一次,不会被重复调用的。

    静态构造函数适用于延时进行系统初始化的操作,这能加快系统的启动速度。

     

    注意,静态构造函数必须是没有参数的,而且肯定是私有的,不能设置可访问级别。

     

    实例成员

    没有被“static”关键字修饰的类型成员就是实例成员,比如PeopleClass类型中定义了一个ToString方法,其代码如下。

    public override string ToString()

    {

        return _Code + " " + _Name;

    }

    此时不能用“PeopleClass.ToString”来调用这个方法,必须首先创建对象实例,然后调用这个对象实例的方法,其演示代码如下

    PeopleClass instance = new PeopleClass( );

    instance.ToString( ) ;

     

    虚拟成员

    被关键字“virtual”修饰的成员类型是虚拟成员,比如以下代码就包含了一个名为“Sum”的虚拟函数。

    public class MyClass

    {

        public virtual int Sum(int a, int b)

        {

            return a + b;

        }

    }

    其实虚拟成员并不虚拟,它可以包含实质性的功能代码,能完成一定的功能。只不过虚拟成员可以方便的被重载而已,继承者也可以根据需要不重载这些虚拟方法。

     

    抽象成员

    被关键字“abstract”修饰的类型成员就是抽象成员。抽象成员只能是属性、方法和索引器。以下代码就定义了一个抽象方法。

    public abstract int Sum(int a, int b) ;

    在这段代码中,“public”说明方法是公开的;“abstract”说明这是一个抽象的成员;“int”为方法的返回值类型;“Sum”为方法的名称;“int a , int b”为方法的参数列表。

    定义抽象类型和定义接口的方法类似,只需要写出成员的声明即可,但还需要写出抽象成员的可访问性。

    抽象成员必须出现在抽象类中,而且在从抽象类派生新类型时,所有的抽象方法必须重写以填充方法体。

     

    抽象成员和虚拟成员是有区别的,抽象成员不能定义任何实质的功能,必须被重载;而虚拟成员必须包含完整的代码结构,可以包含实质功能,可以不被重载。[袁永福版权所有]

    常数成员

    被关键字“const”修饰的成员字段为常数字段,可以使用“类型名称.字段名”来引用常数。比如以下代码就包含了一个常数

    public class MyClass

    {

        public const double PI = 3.1415926;

    }

    对此我们可以使用“MyClass.PI”来获得这个常数值。常数值是不能修改的,比如对于赋值代码“MyClass.PI = 3.14;”就是错误的;相对于的,静态字段是可以被修改的,比如此处使用代码“public static double PI = 3.1415926;”来定义这个字段,则就可以对这个字段赋值了。

  • 相关阅读:
    Linux文件系统的设计
    HTML中Select的使用具体解释
    【大话设计模式】—— 工厂方法模式
    C++ Primer 学习笔记_84_模板与泛型编程 --模板特化
    Arcgis API for Android之GPS定位
    “大型票务系统”中对机器恶意訪问的处理——验证码
    hdu 4611
    Java实现 蓝桥杯VIP 算法训练 ALGO-85进制转换
    Java实现 蓝桥杯VIP 算法训练 摆动序列
    Java实现 蓝桥杯VIP 算法训练 摆动序列
  • 原文地址:https://www.cnblogs.com/xdesigner/p/2127243.html
Copyright © 2020-2023  润新知