• C#基础知识系列五(构造函数)


    构造函数的作用:

      1、当一个类在new实例化对象时,可调用构造函数进行初始化对象。

      2、不带参数的构造函数称为“默认构造函数”。 无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是static的,否则 C# 编译  器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。

      3、通过将构造函数设置为私有构造函数可以阻止类被实例化。

      4、结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将struct中的每个字段初始化为默认值。   只有当 struct 用 new 实例化时,才会调用此默认构造函数。

    实例构造函数

    使用 new 表达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量。 要初始化静态类或非静态类中的静态变量,必须定义静态构造函数。

    class CoOrds
    {
        public int x, y;
    
        // constructor
        public CoOrds()
        {
            x = 0;
            y = 0;
        }
    }

    只要创建基于 CoOrds 类的对象,就会调用此实例构造函数。 诸如此类不带参数的构造函数称为“默认构造函数”。 然而,提供其他构造函数通常十分有用。 例如,可以向 CoOrds 类添加构造函数,以便可以为数据成员指定初始值:

    public CoOrds(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    这样便可以用默认或特定的初始值创建 CoOrd 对象,如下所示:

    CoOrds p1 = new CoOrds();
    CoOrds p2 = new CoOrds(5, 3);

    如果某个类没有构造函数,则会自动生成一个默认构造函数,并使用默认值来初始化对象字段。

    也可以用实例构造函数来调用基类的实例构造函数。 类构造函数可通过初始值设定项来调用基类的构造函数,如下所示:

    abstract class Shape
    {
        public const double pi = Math.PI;
        protected double x, y;
    
        public Shape(double x, double y)
        {
            this.x = x;
            this.y = y;
        }
    
        public abstract double Area();
    }
    
    class Circle : Shape
    {
        public Circle(double radius)
            : base(radius, 0)
        {
        }
        public override double Area()
        {
            return pi * x * x;
        }
    }

    在此示例中,Circle 类将表示半径和高度的值传递给 Shape(Circle 从它派生而来)提供的构造函数。

    私有构造函数

     私有构造函数是一种特殊的实例构造函数。 它通常用在只包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。 例如:

    class NLog
    {
        // Private Constructor:
        private NLog() { }
    
        public static double e = Math.E;  //2.71828...
    }

    声明空构造函数可阻止自动生成默认构造函数。 注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。 但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。

    当没有实例字段或实例方法(如 Math 类)时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。 如果类中的所有方法都是静态的,可考虑使整个类成为静态的。

    下面是使用私有构造函数的类的示例:

        public class Counter
        {
            private Counter() { }
            public static int currentCount;
            public static int IncrementCount()
            {
                return ++currentCount;
            }
        }
    
        class TestCounter
        {
            static void Main()
            {
                // Counter aCounter = new Counter();   // Error
                Counter.currentCount = 100;
                Counter.IncrementCount();
                Console.WriteLine("New count: {0}", Counter.currentCount);
                Console.WriteLine("Press any key to exit.");
                Console.ReadKey();
            }
        }

    注意,如果您取消注释该示例中的以下语句,它将生成一个错误,因为该构造函数受其保护级别的限制而不可访问:

    // Counter aCounter = new Counter();   // Error

    静态构造函数

     静态构造函数用于初始化任何 静态 数据,或用于执行仅需执行一次的特定操作。 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。

        class SimpleClass
        {
            static readonly long baseline;
            static SimpleClass()
            {
                baseline = DateTime.Now.Ticks;
            }
        }

    静态构造函数具有以下特点:

    • 静态构造函数既没有访问修饰符,也没有参数。

    • 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化

    • 无法直接调用静态构造函数。

    • 在程序中,用户无法控制何时执行静态构造函数。

    • 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。

    • 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。

    • 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持

     

    一个对象的初始化八步:

    1. 静态数据的初始化
    2. 静态数据的初始化器运行
    3. 基类静态构造函数运行
    4. 静态构造函数运行
    5. 实例数据初始化
    6. 实例初始化器运行
    7. 基类实例构造函数运行
    8. 实例构造函数运行

    本文转载:https://www.cnblogs.com/aehyok/p/3507721.html

  • 相关阅读:
    js返回上一页并刷新思路
    C#字符串拼接
    html2canvas截图问题,图片跨域导致截图空白
    VS2017未能添加对"System.Drawing.dll"的引用
    微信小程序云开发获取文件夹下所有文件
    js解析json报错Unexpected token i in JSON at position 1
    人工智能学习
    suricata的模块和插槽
    学习助手开发(二)——表单排序
    成功在Caterpillar代码中插入事件对象-20200917
  • 原文地址:https://www.cnblogs.com/yueyongsheng/p/15157269.html
Copyright © 2020-2023  润新知