一篇文章搞懂c #中的构造函数

什么是 C# 中的构造函数?

构造函数是负责初始化该类中的变量的一种特殊方法。

构造函数方法的名称与它所在的类的名称完全相同,且无法更改名称。如果类名是 Employee,则构造函数的名称将为 Employee,如果类名为 Student,则构造函数称也将为 Student。

在 C 代码中理解构造函数

为了更好地理解,我们创建了一个test类,它显示了编译前后的代码。

在 C 中理解构造函数的示例#

你可以在这里看到,编译后,编译器将公共构造函数添加到类中并初始化变量。

我们在类中声明的每个变量和在类中声明的每个字段都有一个默认值。所有数值类型都以 0 初始化,布尔类型以 false 初始化,字符串和对象类型以 null 初始化。为了更好地理解,请看下图。

什么是 C# 中的构造函数?

我们可以看到test类。在编译前并没有构造函数,但编译后却有一个test构造函数,这说明如果我们没有在类中显示的声明构造函数,则由编译器隐式的提供。换句话说,每一个类中都存在一个构造函数,无论它是显示的提供还是由编译器隐式的提供。

** 使用构造函数时要记住的要点:**

  1. 隐式定义的构造函数是无参数的,这些构造函数也称为默认构造函数;

  2. 隐式定义的构造函数是公共的;

  3. 我们还可以在类下定义一个构造函数,如果我们定义它,我们可以称它为显式构造函数,显式构造函数可以是无参数的,也可以是参数化的。

如何在 C# 中显式定义构造函数?

我们还可以在 C# 中显式定义构造函数。以下是显式构造函数语法。下面代码包括两个构造函数,一个是有参构造,一个是无参构造。

public class Test
{
    public int i;
    public Test()
    {
        i = 99 ;
        Console.WriteLine("调用了无参构造函数");
    }
​
    public Test(int i)
    {
        this.i = i ;
        Console.WriteLine("调用了有参构造函数");
    }
}

*调用构造函数:

当我们创建一个类的时候,构造函数就被调用。

Test test = new Test();//调用无参构造函数。
Test test1 = new Test(3);//调用有参构造函数

输出结果

*静态构造函数#

在 C# 中,也可以将构造函数创建为静态构造函数,当我们这样做时,它称为静态构造函数。在静态构造函数中,不能使用任何访问说明符,如 public、private 和 protected。我们还是以test为例来看见来看怎么创建一个静态的构造函数。

C 中的 Static 构造函数#

上述例子是显示的创建静态构造函数,那是否可以由编译器隐式的提供静态构造函数呢?可以,当类中有静态成员时,即使我们没有显示的定义静态构造函数,编译器也会隐式地提供一个静态构造函数。还是上面的例子,我们在test类中添加一个静态成员变量j, 在这个内容,虽然我们没有显示的提供一个静态构造函数,但是编译器会隐式帮我们提供一个静态构造函数。

   public class Test
   {
       public int i;
       public static int j;
       public Test()
       {
           i = 99 ;
           Console.WriteLine("调用了无参构造函数");
       }
       
       public Test(int i)
       {
           this.i = i ;
           Console.WriteLine("调用了有参构造函数");
       }
   }

静态构造函数永远是在类中第一个被执行的代码,所以我们在静态构造函数中无法传递参数。换句话说,静态构造函数都是无参构造函数,如果我们传递参数,编译器会报错。

需要注意的是:

一个类中只能有一个静态构造函数。它不能被显式调用,它总是被隐式调用。静态构造函数应不带任何参数。它只能访问类的静态成员。静态构造函数定义中不应有任何访问说明符。静态构造函数将只调用一次,即在类加载时。

什么是 C# 中的私有构造函数?

在 C# 中,也可以将构造函数创建为私有构造函数。当构造函数被私有访问修饰符修饰时,我们称为私有构造函数。私有构造函数只能被内部的成员调用,所以我们通过内部的CreateInstance方法调用私有构造函数。

  
 public class MyClass
   {
       // 类的某个属性  
       public int Value { get; private set; }
       // 私有的有参构造函数  
       private MyClass(int value)
       {
           Value = value;
           Console.WriteLine($"MyClass instance created with value: {value}");
       }
​
       // 公共的静态创建方法  
       public static MyClass CreateInstance(int value)
       {
           return new MyClass(value); // 在类内部调用私有的构造函数  
       }
​
   }

当我们从外部调用时,编译器会报错。

那是不是有私有构造函数时,我们就不能够从外部创建类的实例呢?答案是否定的,当内中还存在公有构造函数时,我们仍然可以创建类的实例,只不过创建类的实例是通过公有构造函数。

 public class MyClass
 {
     // 类的某个属性  
     public int Value { get; private set; }
     // 私有的有参构造函数  
     private MyClass(int value)1500.
     {
         Value = value;
         Console.WriteLine($"MyClass instance created with value: {value}");
     }
​
     // 公共的静态创建方法  
     public static MyClass CreateInstance(int value)
     {
         return new MyClass(value); // 在类内部调用私有的构造函数  
     }
​
     public MyClass()
     {
         Console.WriteLine("通过共有构造函数创建。");
     }
 }

运行结果

博客首发在头条,可以在头条搜索:sunny老师,获取一手信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值