初学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#还提供了对象初始化器,即可以初始化对象中所有允许访问的字段和属性,其实也很简单,只需把上面程序中第7、8行的代码改成这样:
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旗舰版下运行通过
- 初学C#_7
- [C++_7]继承_1
- C学习之路_7
- c/c++笔试面试题_7
- 数据结构_7:图算法 :c++/STL
- 初学C#
- 初学C
- 初学C
- 初学C
- 初学C
- 初学C
- 初学C
- 初学C
- 初学C
- 初学C
- 初学C
- 为多态基类声明一个虚析构函数(Effective C++_7)
- c++_7: 拷贝构造函数和赋值构造函数
- Hibernate4获取Session的代码
- c++ primer plus第七章习题答案
- 【JS学习笔记】04 JavaScript 表单验证
- 学习OpenCV:滤镜系列(12)——计算模式(强光)
- VC++中利用磁盘序列号识别正版软件
- 初学C#_7
- uva 128
- 石子(环形)合并问题_dp
- 解决Android SDK Manager更新、下载速度慢
- Linux集群技术简介
- 学习OpenCV:滤镜系列(13)——计算模式算法集合
- 【zimg入门之一】zimg高性能图片服务器浅谈
- SDUTOJ 2506 完美网络
- OpenGL与OpenCV实现增强现实