在C++语言里面结构struct和类在许多方面都是相近的,甚至相同,只不过在存取方式上存在差别。但是,在C#下结构和类有着明显的不同点:
1、结构是堆栈对象,不能在堆上创建它;
2、结构可以继承接口,但是不能继承自其它结构;
3、不能重写结构的默认构造函数,需要自定义构造函数时必须创建附带参数的构造函数,以保证和默认构造函数的参数列表有所区别;
4、当使用new来创建结构对象时其构造函数自动被调用,若仅是像声明一个int类型的变量那样声明一个结构类型的变量而不new的话,那么结构中成员变量必须被初始化后才能使用该结构对象。
struct Student : IGrade
{
public int maths;
public int english;
public int csharp;
public int GetTot()
{
return maths+english+csharp;
}
public Student(int y)
{
maths = english = csharp = y;
}
public string GetGrade()
{
if(GetTot() > 240 )
return "Brilliant";
if(GetTot() > 140 )
return "Passed";
return "Failed";
}
}
interface IGrade
{
string GetGrade();
}
接下来看看怎么使用刚才创建的结构,代码如下:
Student s1 = new Student();
Console.WriteLine(s1.GetTot());
Console.WriteLine(s1.GetGrade());
输出:
0
Failed
上述代码显示默认的构造函数被调用,构造函数将所有结构中的int成员变量都自动初始化为0,这就是为何合计为0的原因。
下面来看一段有意思的代码:
Student s2;
s2.maths = s2.english = s2.csharp = 50;
Console.WriteLine(s2.GetTot());
Console.WriteLine(s2.GetGrade());
输出:
150
Passed
上述代码我们没有使用new来创建结构,所以构造函数不会被调用,仅是声明一个结构类型的变量s2,但是紧接着我们为结构的所有成员变量进行初始化赋值,那么结构照样可以使用。尽管很多人都在争论,认为这种赋值伎俩太不专业且显得有点傻,然而谁也无法找到合情合理的解释,但是这样做的确可行。当我们注释掉赋值语句后,编译器则会报错:使用了未赋值的本地变量s2。
我们还可以使用自定义构造函数并传递一个整型变量来创建结构对象,代码如下:
Student s3 = new Student(90);
Console.WriteLine(s3.GetTot());
Console.WriteLine(s3.GetGrade());
输出:
270
Brilliant
不像类是引用类型,结构是值类型的,所以结构比类操作起来更简单。当使用类仅存储一些数据时,你会发现使用结构会好得多!结构化数组是在堆上创建的,而以一个一个类的形式来创建对象,则必须提前在堆上分配内存,而且每个类的引用地址也需要额外保存起来,所以使用结构化数组则更加的有效率。实际上在.Net框架里大部分类也都是结构,譬如:System.Drawing.Point。
1、结构是堆栈对象,不能在堆上创建它;
2、结构可以继承接口,但是不能继承自其它结构;
3、不能重写结构的默认构造函数,需要自定义构造函数时必须创建附带参数的构造函数,以保证和默认构造函数的参数列表有所区别;
4、当使用new来创建结构对象时其构造函数自动被调用,若仅是像声明一个int类型的变量那样声明一个结构类型的变量而不new的话,那么结构中成员变量必须被初始化后才能使用该结构对象。
struct Student : IGrade
{
public int maths;
public int english;
public int csharp;
public int GetTot()
{
return maths+english+csharp;
}
public Student(int y)
{
maths = english = csharp = y;
}
public string GetGrade()
{
if(GetTot() > 240 )
return "Brilliant";
if(GetTot() > 140 )
return "Passed";
return "Failed";
}
}
interface IGrade
{
string GetGrade();
}
接下来看看怎么使用刚才创建的结构,代码如下:
Student s1 = new Student();
Console.WriteLine(s1.GetTot());
Console.WriteLine(s1.GetGrade());
输出:
0
Failed
上述代码显示默认的构造函数被调用,构造函数将所有结构中的int成员变量都自动初始化为0,这就是为何合计为0的原因。
下面来看一段有意思的代码:
Student s2;
s2.maths = s2.english = s2.csharp = 50;
Console.WriteLine(s2.GetTot());
Console.WriteLine(s2.GetGrade());
输出:
150
Passed
上述代码我们没有使用new来创建结构,所以构造函数不会被调用,仅是声明一个结构类型的变量s2,但是紧接着我们为结构的所有成员变量进行初始化赋值,那么结构照样可以使用。尽管很多人都在争论,认为这种赋值伎俩太不专业且显得有点傻,然而谁也无法找到合情合理的解释,但是这样做的确可行。当我们注释掉赋值语句后,编译器则会报错:使用了未赋值的本地变量s2。
我们还可以使用自定义构造函数并传递一个整型变量来创建结构对象,代码如下:
Student s3 = new Student(90);
Console.WriteLine(s3.GetTot());
Console.WriteLine(s3.GetGrade());
输出:
270
Brilliant
不像类是引用类型,结构是值类型的,所以结构比类操作起来更简单。当使用类仅存储一些数据时,你会发现使用结构会好得多!结构化数组是在堆上创建的,而以一个一个类的形式来创建对象,则必须提前在堆上分配内存,而且每个类的引用地址也需要额外保存起来,所以使用结构化数组则更加的有效率。实际上在.Net框架里大部分类也都是结构,譬如:System.Drawing.Point。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14325734/viewspace-545395/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14325734/viewspace-545395/