初学C#_7

来源:互联网 发布:阿里云怎么注销备案 编辑:程序博客网 时间:2024/05/21 00:54

构造器

其实就是java、C++中烦的构造函数(构造方法),因为在——http://blog.csdn.net/u012421456/article/details/36049977说过java的构造函数,所以这里不会再太过详细的说明


例1:

using System;class Program{    static void Main()   //Main函数的参数如果没用到,也可以不用写的    {        Student s = new Student("百晓生", 1);        s.level = "中";   //依然可以通过对象对类中的字段进行赋值        s.Print();        Console.WriteLine("水平:{0}", s.level);        Console.ReadLine();    }}class Student{    //定义3个公有类型的属性    public string name {get; set;}     public int number {get; set;}    public string level {get; set;}    public Student(string name, int number)  //构造函数    {        this.name = name;    //this的用途无非是点明示该类本身的name        this.number = number;    }    public void Print() //普通函数    {        Console.WriteLine("姓名:{0}\n学号:{1}", name, number);    }}
输出结果为:


由上结果可以发现,这个构造器的用法和java的构造方法是一样的

其实,C#在编译时也会自动提供默认的构造器(隐式),当显示的添加构造器后,默认的构造器就不会被提供

需要注意的是,new运算符返回的是被实例化的对象的类型

在机器内部,new与构造器是这样进行交互的:new从内存管理器获取内存,然后调用指定的构造器,将初始化好的内存传给构造器,接着,构造器内的语句开始执行,构造器内部的语句执行完后,new运算符返回内存引用,它指向的内存处于初始化好的形式。

C#还提供了对象初始化器,即可以初始化对象中所有允许访问的字段和属性,其实也很简单,只需把上面程序中第78行的代码改成这样:        

Student s = new Student("百晓生", 1)      {level = "中" };

就行了


构造器的重载

和其他的重载都是一样的,只举个例子,不多说了

2

using System; class Program{    static void Main()    {        //Student s = new Student("百晓生", 1) { level = "中" };        //       s.level = "中";   //依然可以通过对象对类中的字段进行赋值        //s.Print();        //Console.WriteLine("水平:{0}", s.level);         Console.ReadLine();    }} class Student{    //定义3个公有类型的属性    public string name { get; set; }    public int number { get; set; }    public string level { get; set; }     public Student(string name, int number)  //传递两个参数的构造函数    {        this.name = name;            this.number = number;    }     public Student(string name)   ////传递一个参数的构造函数    {        this.name = name;    }     public Student(string name, int number, string level)   ////传递三个参数的构造函数    {        this.name = name;        this.number = number;        this.level = level;    }     public void Print() //普通函数    {        Console.WriteLine("姓名:{0}\n学号:{1}", name, number);    }}
这样,通过调用不同的构造器,可以进行不同的赋值


使用this调用另一个构造器

通过上面的例子可以发现,在传递较多的参数时,对一个字段的初始化多次出现,这样的代码显然不利于维护,所以,C#提供了构造器链,即在构造器重调用另一个构造器,这个可以用构造器初始化器来实现

3

using System; class Program{    static void Main()    {        Student s = new Student("百晓生", 1, "中" );        s.Print();        Console.WriteLine("水平:{0}", s.level);         Console.ReadLine();    }} class Student{    public string name { get; set; }    public int number { get; set; }    public string level { get; set; }     public Student(string name, int number)    {        this.name = name;            this.number = number;    }     public Student(string name, int number, string level)         :this(name, number)                         //注意这里    {        this.level = level;    }     public void Print()    {        Console.WriteLine("姓名:{0}\n学号:{1}", name, number);    }}

匿名类型

C#3.0引入了对匿名类型的支持。它们是由编译器动态生成的数据类型,而不是通过显示的类型定义来生命的

例4:

using System; class Program{    static void Main()    {        var s0 =               //这就是用匿名类的对象给匿名类型的字段给予赋值             new             {                 name = "王二",                 number = 1,                 level = "高"             };        var s1 =             new            {                name = "张三",                number = 2,                level = "中"            };        var s2 =             new            {                s0.name,   //是这样使用上面的匿名类中的字段                s1.number, //同上                level = s0.level    //注意这里            };         Console.WriteLine("姓名:{0}\n学号:{1}\n水平:{2}", s0.name, s0.number, s0.level);        Console.WriteLine("姓名:{0}\n学号:{1}\n水平:{2}", s1.name, s1.number, s1.level);        Console.WriteLine("姓名:{0}\n学号:{1}\n水平:{2}", s2.name, s2.number, s2.level);         Console.WriteLine();        Console.WriteLine(s0);        Console.WriteLine(s1);         Console.WriteLine();        Console.WriteLine(s2);         Console.ReadLine();    }}
输出结果为:


这个程序结果的新颖之处在于最后的三个输出。且看程序,声明匿名类的对象是需要在new后面使用{ },而在输出时,是直接输出对象名,之后会输出该对象所有的字段的内容,而不是通过对象名.字段来输出字段的值,而且输出是有格式的输出


        这些博客主要是讲我在学C#(我主要看的书是《C#本质论第三版》)的过程中,发现它和C/C++Java的不尽相同之处,都是自己的见解,也是比较浅显的知识,如有错误,欢迎指出

(前段时间,彻底的把VS2012卸载了,装上了VS2010)所有程序都是在Visual Studio 2010旗舰版下运行通过

0 0
原创粉丝点击