专栏首页技术博客C#基础知识系列五(构造函数)

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 方法。
  • 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#类和结构体的异同点简单总结

    类和结构的异同点? 异:  1.关键字不同 一个是class,一个是struct     2.类型不同,一个是引用类型,一个是值类型(一个堆区,一个栈区)   ...

    aehyok
  • C#简单的面试题目(三)

    31.C#提供一个默认的无参构造函数,当我实现了另外一个有一个参数的构造函数时,还想保留这个无参数的构 造函数。这样我应该写几个构造函数?     两个,一...

    aehyok
  • C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)

       这一节主要来了解一下类和结构体之间的异同点、以及针对String和StringBuilder的用法、equals和==,其实可以看出很多地方都用到了上一节...

    aehyok
  • 关于Java构造函数(Constructor)的常见问题总结1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法2 常见错误:Implicit super constructor is und

    当继承自一个类的时候,构造方法就会首先调用super()方法。如果没有显式的写这个语句,那么编译器就会自动插入这个语句。这就是为什么我们上面的那个例子程序会先调...

    desperate633
  • C#类学习-3

    只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。

    py3study
  • C#-构造函数

    创建一个类的时候,使用new运算符对类进行实例化。在为新对象分配内存之后,new运算符立即调用构造函数。

    祝你万事顺利
  • 构造函数浅析

    构造函数浅析<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

    ternturing
  • 关于构造函数与析构函数的分享

    创建复杂的类类型的对象时,可能需要对一些数据或者对象中需要使用的资源进行一些初始化操作,比如设置成员的默认值,打开数据库,打开文件,等等,而这些准备工作,就可以...

    用户7053485
  • 认真理一理C++的构造函数

    我们在C语言中使用堆栈中的变量时,常常需要给它赋初始值,用于避免使用到了不可预知的值。同样的,在C++中也需要有这样的动作,只是由于C++的对象可能比基本数据要...

    编程珠玑
  • Scala-8.面向对象-构造函数

    悠扬前奏

扫码关注云+社区

领取腾讯云代金券