C#箴言:使用构造函数初始化语句

函数|语句

  在写程序的时候,往往会出现为一个类型提供不同场景的构造函数,可能大多构造函数比较相似,而C#中又不允许缺省参数,因此构造函数的编写无疑是一个重复工作。但是使用Copy和Paste来完成构造函数的编写,有时候很难达到统一,尤其是当成员发生变化的时候。因此比较常见的替换方法就是为构造函数提供一个统一的成员函数来完成初始化工作。

  例如:

public class MyClass
{
 private int _Age;
 private string _Name;

 public MyClass( string Name)
 {
  InitMember( Name, 20 );
 }
 public MyClass( string Name, int Age )
 {
  InitMember( Name, Age );
 }

 /// <summary>
 /// Init class members
 /// </summary>
 /// <param name="Name"></param>
 /// <param name="Age"></param>

 private void InitMember( string Name, int Age )
 {
  _Age = Age;
  _Name = Name;
 }
}
  不过,在C#中提供了更为简明的方法,就是在构造函数初始化语句中调用另一构造函数,那么上面的形式可以改写为如下这样。

public class MyClass
{
 private int _Age;
 private string _Name;

 public MyClass( string Name):this( Name, 20 )
 {}

 public MyClass( string Name, int Age )
 {
  _Age = Age;
  _Name = Name;
 }
}
  对于这两者来说,执行效率没有太大差别,但从代码质量而言,后者要好很多,而且会使代码看起来更清晰。

  其次,对于基类的调用。由于成员函数不能调用基类的构造函数,所以对于第一种编写就比较困难,后者就简单多了。

  例如:

public class MyClass:BaseClass
{
 private int _Age;
 private string _Name;

 public MyClass( string Name):this( Name, 20 )
 {}

 public MyClass( string Name, int Age ):base( Name, Age )
 {
  _Age = Age;
  _Name = Name;
 }
}
  这里要提的一点就是构造函数初始化语句,对于“this”或者“base”之类的调用只能有一个,不能并存。

  最后,就是对于readonly常量的初始化,由于readonly常量只能通过成员初始化语句或者在构造函数中被修改,因此在成员函数中无法修改readonly常量,这也是构造函数初始化语句要比成员函数好的重要一个因素。

  有了上面的说明,对于两者的对比,可以形成如下这个简单的对比表。

  效率 代码结构 基类调用 静态成员初始化
构造函数初始化语句 一样 简明清晰 容易 可以
成员函数 比较清晰 比较麻烦 不能

    (注:这里不提倡Copy/Paste方法来重复编写构造函数)

时间: 2024-09-22 08:11:05

C#箴言:使用构造函数初始化语句的相关文章

C#箴言:用静态构造函数初始化静态成员

函数|静态 编写程序的时候难免要使用到静态成员,由于静态成员的访问是脱离类型对象的,所以使用非静态构造函数,私有方法或者一些其他方法都是不合理的..Net提供了成员初始化语句和静态构造函数来初始化静态成员. 根据上一个单元,我们可以知道静态成员的初始化语句会早于静态构造函数执行,其次还知道成员初始化语句的好处和一些限制.这里要提的一点就是,静态构造函数和实例构造函数之间的区别,因为静态构造函数是由CLR调用执行的,所以静态构造函数只能是一个,同时不能还有参数.那么静态构造函数相对于成员初始化的一

《Effective C#》:使用成员初始化语句

为了方便内容的开展,我先说说一个对象的构造过程. 对于类型第一 个实例的构造过程大致如下: 1.分配静态成员的内存空间,此时空间存 储数据为0: 2.执行静态成员的初始化语句: 3.执行基类的静 态构造函数: 4.执行类型的静态构造函数: 5.分配成员的内存 空间,此时空间存储数据为0: 6.执行成员的初始化语句: 7. 执行相应的基类构造函数: 8.执行类型的构造函数. 那么对于 同类型的后续创建对象,前4个步骤不用执行的,直接从第5步开始. 现 在来说说为什么推荐使用成员初始化语句来初始化成

2013级C++第5周(春)项目——用构造函数初始化

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答   有同学总结:老二说用数组法做给了我思路,真是有兄弟,不孤单.做了这道题才发现以前没用数组法做的那个判断第几天的程序结果存在错误. 我评论:每个人身边都有一帮子兄弟.靠兄弟,就不用靠老师.兄弟总在身边,弟兄们一起长大! 还有,实践中感受到的,就是真正学习到的.在学习中,只有将直接的体验与老师的讲解.看过的书交融起来,才能真

数组对象使用构造函数初始化的问题

问题描述 数组对象使用构造函数初始化的问题 解决方案 楼主你这样写不行的,只有定义的时候才能那么初始化 类里面加个成员函数用来设置变量的值SetValue class student { string name; double score; static int num; static double sum; public: student(string n = "no name", double s = 0):name(n),score(s) { num++; sum += scor

构造函数初始化对象。。。

问题描述 构造函数初始化对象... 例如: public class A{ private B b; A(){ b = new B(); } } 1.这样做的好处 2.有什么场景会用到 解决方案 这是类的聚合嘛,比如说,一个LinkedList类(链表) 聚合一个叫做Header的Node类型(头节点),并且在构造函数中初始化它. 解决方案二: 处理数据 比如你想要的B数据是int的,但是获取到的却是string类型的数字,这时就用这个处理下 解决方案三: 一楼正解.类的组合使用方式,在构造函数

c++ 构造函数初始化报错如何解决

问题描述 c++ 构造函数初始化报错如何解决 #include #includeusing namespace std;class Teacher{public: Teacher(); Teacher(string nameint age) ;//如果对age进行初始化并且在main函数中实例化 一个 t5("Vivion")为什么会报错 Teacher(const Teacher&tea); void setName(string _name); string getName

struct-c++构造函数初始化成员变量的问题

问题描述 c++构造函数初始化成员变量的问题 struct GenListNode { }; struct Items { int utype; union { int ref; T value; GenListNode* link; }info; Items() :utype(0), info.ref(0) {};//编译提示这里语法错误 }; int main() { Items i; return 0; } 为什么会出错? 解决方案 代码不完整GenListNode<T>* link;

C++构造函数初始化顺序详解_C 语言

1.构造函数.析构函数与拷贝构造函数介绍 构造函数 1.构造函数不能有返回值 2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值.不能重载,也就是说,一个类中只可能定义一个析构函数 2.如果一个类中没有定义析构函数,系统也会自动生成一个默认的析构函数,为空函数,什么都不做 3.调用条件:1.在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被

c++-C++类构造函数初始化列表

问题描述 C++类构造函数初始化列表 #include using namespace std; class A { private: int n1; int n2; public: A() { n2=0; n1=n2+2; }//输出结果为:n1:2, n2: 0 A():n2(0),n1(n2+2){}//输出结果为n1:-858993458, n2: 0 //上面这两种方式有啥区别,求指导,为啥结果不一样 void Print(){ cout << "n1:" <