精华内容
下载资源
问答
  • c#构造函数

    2017-11-13 21:23:58
    c#构造函数
    由c#继承可以看到 在初始化一个子类的时候 都会有一个父类在子类初始化之前被建立出来
    之后子类才会去继承这个父类的各项 所以说初始化的父类中的成员都会传给子类 默认调用的父类构造函数是无参的构造函数 而如果没有或是被覆盖了  那就需要子类的构造函数来指定了用 base() 来指定 否则编译器会报错


    Demo

    class A      
        {
            public int num { get; set; }
            //public A()
            //{
            //    Console.WriteLine(111);
            //}

    public A(int i)
            {
                num = i;
                Console.WriteLine(i);
            }
          
        }
        class B : A
        {
            public B(int i) //应改为 public B(int i):base(5)  解决了之下所指出的错误
            {
                Console.WriteLine(this.num);
            }

        }
        class Program
        {
            static void Main(string[] args)
            {
                B b = new B(666);//此处报错 为A不包含 有零个参数的构造函数
                Console.ReadLine();
            }
        }


    就是初始化静态成员

    比如有几个静态成员需要初始化
    那你把初始化代码放到哪呢?

    放到普通构造函数里,那肯定不行。因为静态成员没有创建实例就要可用。

    专门建一个static public方法来初始化?这样用起来非常不方便,你需要在“第一次”使用静态成员前先调用这个方法。
    如果你在使用静态成员前忘了调用该方法,会导致错误。
    如果重复调用,又是冗繁操作。

    所以静态构造函数就派上用场了。
    它会在你第一次调用静态成员(或创建实例)的时候自动被调用
    下面是MSDN对静态构造函数特点的描述:
      1.静态构造函数既没有访问修饰符,也没有参数
      2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类
      3.无法直接调用静态构造函数
      4.在程序中,用户无法控制何时执行静态构造函数

    记得在c#构造函数中将属性的初始化写进去 否则属性的值为null是不能用的
    展开全文
  • C# 构造函数

    2020-01-13 09:44:51
    C# 构造函数 * 不带任何参数的构造函数称为“默认构造函数”,每当使用 new 运算符实例化对象且不为 new 提供任何参数时,会调用默认构造函数。 ——实例构造函数 * 除非类是静态的,否则C#编译器将为无构造函数的类...

    C# 构造函数

    * 不带任何参数的构造函数称为“默认构造函数”,每当使用  new 运算符实例化对象且不为 new 提供任何参数时,会调用默认构造函数。 ——实例构造函数
    * 除非类是静态的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化
    * 将构造函数设为私有构造函数(private),可以阻止类被实例化
    * 结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个显式默认构造函数。此构造函数会将 struct 中的每个字段初始化为默认值。(但是,只有使用 new 实例化 struct 时,才会调用此默认构造函数)
    * 两个类和 structs 都可以定义带参数的构造函数。必须通过 new 语句或 base 语句调用带参数的构造函数,且都不需要定义默认构造函数
    * 在执行构造函数块之前调用基类的构造函数:base 关键字可带参数使用,也可不带。构造函数的任何参数都可用作 base 的参数,或用作表达式的一部分。
    * 派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(若有)下面俩声明等效:
    
    public Manager(int initialdata) { //Add further instructions here. }
    public Manager(int initialdata) : base() { //Add further instructions here. }
    
    * 若基类没有提供默认构造函数,派生类必须使用 base 显式调用基类构造函数
    * 构造函数可以使用 this 关键字调用同一对象中的另一构造函数。和 base 一样,this 可带参数使用也可不带,构造函数中的任何参数。。。(与 base 用法一致)
    

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

    • 声明空构造函数可阻止自动生成默认构造函数(注意:如果不对构造函数使用访问修饰符,则在默认情况下它认为私有构造函数。但是通常会显式的使用 private 修饰符来清楚的表明该类不能被实例化)
    • 当没有实例字段或实例方法时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类得实例。如果类中得所有方法都是静态的,可考虑使整个类称为静态的。

    静态构造函数由static关键字修饰,而并且没有public、private修饰,更没有参数特点:

    • 静态构造函数除static外无其它修饰关键字,因为该构造函数并不是有程序员调用的,而是由.Net框架在合适的时机调用的
    • 静态构造函数没有参数,因为框架不可能知道我们需要在函数中添加什么参数,所以规定不能使用参数
    • 静态构造函数必须加上static,否则跟普通构造函数无异
    • 静态构造函数中不能实例化实例变量(变量可以分为类级别和实例级别的变量,其中类级别的有static关键字修饰)
    • 静态构造函数调用时机,是在类被实例化或者静态成员被调用的时候进行调用,并且是有.Net框架来调用静态构造函数来初始化静态成员变量(这一点是精华)
    • 一个类有且只能有一个静态构造函数
    • 无参数的静态构造函数和无参数的构造函数是可以并存的。因为他们一个属于类级别,一个属于实例级别,并不冲突
    • 静态构造函数只会被执行一次。
    • 若未在类中自定义静态构造函数,那么框架会自动生成一个默认的构造器

    继承链中构造器执行顺序:
    1. 子-静 —>
    2. 父-静 —>
    3. 父-实 —>
    4. 子-实

    在这里插入图片描述

    展开全文
  • c# 构造函数

    2019-03-11 11:18:01
    C# 构造函数 返回类型 不需要, 也不允许使用返回类型, 比如void. 重载与相互调用 可以调用重载的构造函数. 继承类也可以调用基类构造函数. public class A { public A() { } public A(string x) { } ...

    C# 构造函数

    返回类型

    不需要, 也不允许使用返回类型, 比如void.

    重载与相互调用

    可以调用重载的构造函数.
    继承类也可以调用基类构造函数.
    一个构造函数只能调用一个基类构造函数.

    public class A
    {
    	public A() { }
    	public A(string x) { }
    	public A(string x, string y) :this(x) { }
    }
    
    public class B: A 
    {
    	public B() :base("abc", "def") { }
    }
    

    派生类继承构造函数

    除了无参数构造函数能继承, 其余构造函数不能继承.

    展开全文
  • C#构造函数

    千次阅读 2013-10-04 14:00:37
    C#构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.  (1)C#构造函数的名字必须与类同名;  (2)C#构造函数没有返回类型,它可以带参数,也可以不带参数;  (3)C#构造函数的主要作用...

        C#构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.

        (1)C#构造函数的名字必须与类同名;

        (2)C#构造函数没有返回类型,它可以带参数,也可以不带参数;

        (3)C#构造函数的主要作用是完成对类的初始化工作;

        (4)在创建一个类的新对象(使用new关键字)时,系统回自动调用给类的构造函数初始化新对象;

        C#的类有两种构造函数:实例构造函数和静态构造函数

        C#构造函数之实例构造函数:

        负责初始化类中的实例变量,它只有在用户用new关键字为对象分配内存时才被调用,而且作为引用类型的类,其实例化后的对象必然时分配在托管堆(Managed Heap)上。实例构造函数又分为默认构造函数和非默认构造函数,注意一旦类有了自己的构造函数,无论是有参数还是没有参数,默认构造函数都将无效,而且仅仅声名一个类而不实例化它,则不会调用构造函数。

        C#构造函数之静态构造函数:

        (1)用于对静态字段、只读字段等的初始化;

        (2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的;

        (3)类的静态构造函数在给定应用程序域中至多执行一次,只有创建类的实例或者引用类的任何静态成员才激发,不能带又参数;

        (4)静态构造函数是不可继承的,而且不能被直接调用;

        (5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行.任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项;

        (6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数;

        一个类可以同时拥有实例构造函数和静态构造函数,这是惟一可以具有相同参数列表的同名方法共存的情况。

     

     

    深入代码分析

     

    构造函数是可以将类型实例初始化为有效状态的特殊方法。构造函数在元数据中通常用.ctor来表示,通过IL代码可以看到。在创建一个类型的实例时,通常分为三步:

    1 为实例的数据字段分配内存。

    2 创建对象指针和同步索引块。

    3 调用类型的实例构造器来设置对象的初始状态。

        引用类型的实例构造器

        在创建一个引用类型的对象是,调用类型的实例构造函数之前,会将对象分配的内存做清零处理,就是说在构造函数中没有显示赋值的所有字段都将设置为0或null。

        实例构造函数和一般方法不同,他永远都不能被继承,所有以下的关键字也不能用于实例构造函数(virtual new override sealed abstract)。

        一个类中如果没有显示定义任何构造函数,C#编译器将定义一个默认的无参构造函数。

        抽象(abstract)类的默认构造函数的访问修饰符为protected。

        构造函数可以初始化字段,不过在c#语言中提供了一种简单的方法,在定义字段的时候直接赋值以初始化。如下:

    1 public class User
    2 {
    3    private int _age = 25;
    4    private string _name = "oec2003";
    5 }
    6

         像上面那样的确很方便,但如果有好几个已经初始化的实例字段和多个重载的构造函数同时存在的情况下,就应该将实例字段的初始化放到一个公共的构造函数中,其他的构造函数通过this来显示调用该构造函数,这样可以减少代码生成的大小,看下面的例子。

    1     public abstract  class User
    2      {
    3         private int _age=25;
    4         private string _name="oec2003";
    5         private string _email = "oec2003@gmail.com";
    6
    7         public User(Int32 age)
    8          {
    9             this._age = age;
    10          }
    11
    12         public User(string name)
    13          {
    14             this._name = name;
    15          }
    16
    17         public User(Int32 age, String name, String email)
    18          {
    19             this._age = age;
    20             this._name = name;
    21             this._email = email;
    22          }
    23      }

         正确的写法应该像下面这样 

    1     public abstract  class User
    2      {
    3         private int _age;
    4         private string _name;
    5         private string _email;
    6
    7         public User()
    8          {
    9              _age=25;
    10              _name="oec2003";
    11              _email = "oec2003@gmail.com";
    12          }
    13
    14         public User(Int32 age):this()
    15          {
    16             this._age = age;
    17          }
    18
    19         public User(string name):this()
    20          {
    21             this._name = name;
    22          }
    23
    24         public User(Int32 age, String name, String email):this()
    25          {
    26             this._age = age;
    27             this._name = name;
    28             this._email = email;
    29          }
    30      }

         值类型的实例构造函数

         值类型的实例构造函数和引用类型的有很大不同,在值类型中不能含有无参的构造函数,如果显式指定无参的构造函数将会出现编译错误。如下面代码会出现编译错误:

    1     struct User
    2      {
    3         public Int32 _age;
    4         public String _name;
    5
    6         public User()
    7          {
    8              _age = 25;
    9              _name = "oec2003";
    10          }
    11      }

         值类型不能包含无参的构造函数,也不能在值类型中给字段进行初始化,下面的代码也将不能通过编译。

    1     public struct User
    2      {
    3         public Int32 _age=25;
    4         public String _name="oec2003";
    5      }

         在值类型中也可以有构造函数,不过该构造函数必须含有参数,而且要初始化所有的字段。含有参数但没有初始化所有字段的构造函数也不能通过编译。看如下代码:     由此可见如果值类型中显示包含构造函数必须要初始化所有的字段。如果有多个构造函数,每个构造函数也必须保证初始化所有的字段,否则不能通过编译。如果值类型中不包含构造函数,实例化时所有字段将设置为0或null。

    1    public struct User
    2      {
    3         public Int32 _age;
    4         public String _name;
    5         //只初始化了_age
    6         public User(Int32 age)
    7          {
    8              _age = age;
    9          }
    10         public User(Int32 age,String name)
    11          {
    12              _age = age;
    13              _name = name;
    14          }
    15      }
    16
    17
    18

         类型构造函数

         类 型构造函数也被称为静态构造函数。静态构造函数可以用于引用类型和值类型。和实例构造函数不同的是静态构造函数在一个类型中永远只有一个,并且不能包含参 数。静态构造函数中只能初始化静态字段。下面代码分别展示在值类型(和实力构造函数不同,值类型中允许显示定义无参的静态构造函数)和引用类型中的静态构 造函数。 

    1     //值类型
    2     public struct User
    3      {
    4         public static Int32 _age ;    
    5         public static String _name;
    6
    7         static User()
    8          {
    9              _age = 25;
    10              _name = "oec2003";
    11          }
    12      }
    13     //引用类型
    14     public class User
    15      {
    16         public static Int32 _age ;    
    17         public static String _name;
    18
    19         static User()
    20          {
    21              _age = 25;
    22              _name = "oec2003";
    23          }
    24      }

         为了防止开发人员编写的代码调用静态构造函数,C#编译器会将静态构造函数定义为私有(private)的,并且不能显示地给静态构造函数添加访问修饰符,如果这么做了会出现编译错误。

        上面讲到过在值类型中不能在定义是给实例字段赋值,否则会编译错误,但可以在定义时给静态字段赋值,看下面代码:

    1    public struct User
    2     {
    3        public static Int32 _age = 25;    //正确 可以初始化静态字段
    4         public String _name = "oec2003";  //错误 不能初始化实例字段
    5      }
    6

      

         静态构造函数不应该去调用基类的静态构造函数,因为静态字段是不会被继承到子类中,所以这样做没有意义。

     

    展开全文
  • c# 构造函数 析构函数 1) There are following statements are given below, which of them are correct about constructors in C#.NET? Constructors are not required in a class.Constructors are used to ...
  • C#构造函数

    2015-02-24 09:02:51
    C#高级(三)构造函数 构造函数是和类名相同的类的一个方法,如果没有显式的声明,在系统会在编译的时候,自 动生成一 个不带参数的,不执行任何动作的构造函数。 但如果显式的声明了构造函数,系统就不会自动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,158
精华内容 3,663
关键字:

c#构造函数

c# 订阅