zoukankan      html  css  js  c++  java
  • .NET基础之构造函数

    1.构造函数

    分为实例构造函数、静态构造函数、私有构造函数。

    使用new表达式创建某个类的对象时,

    1.1实例构造函数

    (1)构造函数的名字与类名相同;

    (2)使用new表达式创建类的对象或者结构,会调用其构造函数。并且通常初始化新对象的数据成员;

    (3)除非是静态的,否则会为没有构造函数的类,自动生成一个默认的构造函数,并使用默认值来初始化对象字段

    (4)构造函数可以有参数;

    (5)构造函数可以以多态的形式存在多个构造函数;

    (6)构造函数无返回值类型。

    例:声明Test类,有三个构造函数

     1     public class Test
     2     {
     3         int _aa, _bb;
     4 
     5         public Test()
     6         {
     7             _aa += 10;
     8             _bb += 10;
     9             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
    10         }
    11         public Test (int value)
    12         {
    13             _aa += value;
    14             _bb += value;
    15             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
    16         }
    17         public Test(int x,int y)
    18         {
    19             _aa += x;
    20             _bb += y;
    21             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
    22         }
    23     }

    测试如下:

     1    static void Main()
     2    {       
     3        Test test1 = new Test();
     4        Test test2 = new Test(100);
     5        Test test3 = new Test(1000, 1000);
     6    }  
     7     //Output:
     8     //aa:10,bb:10
     9     //aa:100,bb:100
    10     //aa:1000,bb:1000

    但是示例中的构造函数声明,有时会显得太罗嗦,尤其是当构造函数的功能相近时,可以改为如下的写法:

     1     public class Practice
     2     {
     3         int _aa, _bb;
     4         public Practice(int x,int y)
     5         {
     6             _aa += x;
     7             _bb += y;
     8             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
     9         }
    10         public Practice(int value):this(value,value)
    11         {            
    12         }
    13         public Practice():this(10,10)
    14         { }
    15     }

    或者更进一步,可以改为如下的写法:

     1     public class Play
     2     {
     3         int _aa, _bb;
     4         public Play(int x=100,int y=100)
     5         {
     6             _aa += x;
     7             _bb += y;
     8             Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
     9         }
    10     }

    1.2静态构造函数

    (1)静态构造函数不使用访问修饰符;

    (2)静态构造函数不具有参数;

    (3)在创建第一个实例或引用任何的静态成员之前,将自动调用静态构造函数实现初始化操作;

    (4)不能直接调用静态构造函数;

    (5)用户无法控制在程序中执行静态构造函数的时间;

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

    (7)静态构造函数可以和实例构造函数并存。

    例:

     1     public static int value = 10;
     2     Program()
     3     {
     4         value = 100;
     5     }
     6     static Program()
     7     {
     8         value = 1000;
     9     }
    10     static void Main(string[] args)
    11     {
    12         Console.WriteLine(value);
    13 
    14         Program p = new Program();
    15         Console.WriteLine(Program.value);
    16 
    17         Console.ReadLine();
    18     }

    打印结果为:(因为静态构造函数的调用会早于构造函数)

    1 //output
    2   1000
    3   100

    1.3私有构造函数

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

    当没有实例字段或实例方法时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。

    1.4编写复制构造函数

     1 class Person
     2 {
     3     private string name;
     4     private int age;
     5 
     6     // Copy constructor.
     7     public Person(Person previousPerson)
     8     {
     9         name = previousPerson.name;
    10         age = previousPerson.age;
    11     }
    12 
    13     //// Alternate copy contructor calls the instance constructor.
    14     //public Person(Person previousPerson)
    15     //    : this(previousPerson.name, previousPerson.age)
    16     //{
    17     //}
    18 
    19     // Instance constructor.
    20     public Person(string name, int age)
    21     {
    22         this.name = name;
    23         this.age = age;
    24     }
    25 
    26     // Get accessor.
    27     public string Details
    28     {
    29         get
    30         {
    31             return name + " is " + age.ToString();
    32         }
    33     }
    34 }
    35 
    36 class TestPerson
    37 {
    38     static void Main()
    39     {
    40         // Create a new person object.
    41         Person person1 = new Person("George", 40);
    42 
    43         // Create another new object, copying person1.
    44         Person person2 = new Person(person1);
    45         Console.WriteLine(person2.Details);
    46 
    47         // Keep the console window open in debug mode.
    48         Console.WriteLine("Press any key to exit.");
    49         Console.ReadKey();
    50     }
    51 }
    52 // Output: George is 40

    Demo地址:

    https://download.csdn.net/download/u010312811/10337475

    参考

    https://msdn.microsoft.com/zh-cn/library/k6sa6h87(v=vs.100).aspx

    https://msdn.microsoft.com/zh-cn/library/kcfb85a6(v=vs.100).aspx

    https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=vs.100).aspx

    https://www.cnblogs.com/cang12138/p/8297270.html

  • 相关阅读:
    sqlserver服务 正在挂起更改,导致无法打开或者停止服务
    menuStrip与toolStrip的使用
    sqlDataCommandBuilder为dataGridView自动生成增删改代码时报错
    visual studio属性面板解释文字看不见
    窗体句柄 控件句柄
    form窗体show不出来
    TextBox密码框变文本框,文本框变密码框
    DataSet数据集手动添加一行记录
    Anaconda3-更换为清华源后依旧报错CondaHTTPError: HTTP 000 CONNECTION FAILED
    Kali Linux 国内源
  • 原文地址:https://www.cnblogs.com/imstrive/p/8763581.html
Copyright © 2011-2022 走看看