c# 构造器的一点理解(2)

上一边文章中对引用类型的构造器有了一个介绍。

本文的重点是  值类型的构造器

下边对值类型的构造器进行一下说明 :

先说一下我对值类型构造器的初步印象。

1 值类型一般情况先不需要有构造函数,clr保证其每个字段都为0或者null,负责每个字段的初始化。

2  值类型可以有构造函数,但是必须是有参构造器, 而且必须是被显式的调用,否者不能被调用。 

3 如果值类型没有构造函数,那么clr保证值类型中的每个字段都被初始化成0 或者是null ,但是一旦有了构造器那么clr不扶着初始化每个字段,只能在构造器里面自己初始化每个字段的初始值。

4 只有嵌套在类内部的值类型才会被clr保证初始值是null 或者是 0 . 如果是堆栈上的值类型不保证被初始化成0 或者是null。


先变就几种常见的错误用代码示例一下

	struct point
	{
		int x  = 5 ; //为什么这么些是错误的 : 因为这个写法是为了方便无参构造函数初始化字段的一种简便的语法,因为值类型不允许有无参构造函数,所以这样是错误的
		int y ;
	}

struct point
	{
		//int x  = 5 ; //为什么这么些是错误的 : 因为这个写法是为了方便无参构造函数初始化字段的一种简便的语法,因为值类型不允许有无参构造函数,所以这样是错误的
		int x ;
		int y ;
//		point(){}    不能有无参构造函数 这么些错误的
		point(int i) 
		{
			//如果有了构造函数,那么clr不保证每个字段都能被初始化成0 或者null ,
			//所有在值类型内部就要保证每个字段被初始化成0 或者这null 。
			//这是因为值类型的任何字段被调用之前,那么每个字段都保证有一个初始值。
			x=i ; 	  //所以这种写法是错误的。
			x =y = i ;//这种写法是正确的。 或者把y赋值成0 ;
		}
	}

如果大家真的多这个有兴趣,要自己多动手多试验啊, 今天多值类型的构造器,我就研究到这里了,入门了,以后有空在深入的研究啊。

这边的代码是我学习的全部代码

using System;
using System.Data;
using System.Text;

namespace  myStu
{
	/*
	   值类型的构造器
	*/
	class programe
	{	   
		static void Main(string[] arg)
		{
			try
			{             
			    baseClass  obj = new baseClass() ;
				obj.Test() ;
			}
			catch (Exception err)
			{
				Console.WriteLine(err.Message);
			}
		}
	}
    sealed class baseClass
    {
        public void Test()
        {
			Console.WriteLine("基类的构造器") ;  
        }

    }

	struct point
	{
		//int x  = 5 ; //为什么这么些是错误的 : 因为这个写法是为了方便无参构造函数初始化字段的一种简便的语法,因为值类型不允许有无参构造函数,所以这样是错误的
		int x ;
		int y ;
//		point(){}不能有无参构造函数
		point(int i) 
		{
			//如果有了构造函数,那么clr不保证每个字段都能被初始化成0 或者null ,
			//所有在值类型内部就要保证每个字段被初始化成0 或者这null 。
			//这是因为值类型的任何字段被调用之前,那么每个字段都保证有一个初始值。
			x=i ; 	  //所以这种写法是错误的。
			x =y = i ;//这种写法是正确的。
		}
	}
}


posted @ 2012-01-03 21:40  sdgxboy  阅读(154)  评论(0编辑  收藏  举报