最近在学习C#中遇到一个问题,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Contact asgod = new Contact();
asgod .m_address ar=asgod
asgod.m_address = null;
}
}
class Contact
{
public string m_name;
public struct Address
{
public string m_city;
public string m_street;
}
public Address m_address = null;
}
}
在运行上述代码的时候一直报错,可检查了几遍后也没发现什么错误,最后才知道是在理解结构的定义上出了差错。下面就来讲解下有关结构和类的区别。
在此先看几行简单的代码:
结构实例
public struct clothes { string color; int money; public void consumingmoney() { //implement something } }
类实例
public class people { int height; string name; int age; public void passtime() { //implement something } }
调用过程
public static ovid Main() { struct myclothes=new struct ; //声明结构 people lisan=new people ; //声明类 }
从这些代码中我们可以发现,类和结构的操作是相同的,都是先定义然后实例化后直接调用就可以了。那么区别到底所在呢?
值类型和引用类型
结构是值类型,值类型在栈上分配地址。
类是引用类型,引用类型在堆上分配地址。
栈和堆
栈:主要用来存放函数的参数值,局部变量的值。
堆:一般由程序员分配释放,若程序员不释放,程序结束后可能由操作系统释放。
栈和堆的区别
1.内存申请方式不同
栈是在系统中自动为变量申请空间的,而堆中是由程序员自己申请的,因此也需要指明变量的大小。
2.系统响应的时间不同
从两者的定义上就可知堆的反应时间比较慢些。
3.空间大小不同
栈是一块连续的内存区域,而堆是一块不连续的内存区域,因为堆是靠链表来整理碎片空间来为变量申请空间的。
4.执行效率不同
栈相对于堆来说执行速度较快。
总结
栈的内存小,但是效率高,不过存储的数据只在函数内有效,超出函数就消失了,堆的空间非常大,但是容易产生内存碎片,效率低。以上说是堆和栈的区别,其实也就是结构和类的区别。
结构函数中的变量赋值
看如下代码:
static void Main(string[] args) { a fly = new a(1,2); fly.fun(); } struct a { int b; //在结构中不能直接对其赋值,需要间接的通过构造函数 int c; public static string name = "zhangsan";//静态变量可以直接进行初始化 public a(int str,int s) //带参数的构造函数,必须包含所有的变量 { b = str; c = s; Console.WriteLine("我是一个好人,你知道吗"); } public void fun() { Console.WriteLine("你是一个好人吗"); } } } }
通过上面这个例子,我们就可以了解到,在结构中定义的变量不能初始化,除非是静态变量,只能通过构造函数的方式来为变量间接的赋值。到此我们也就知道刚开始错误例子的问题所在是在实例化结构的时候为其赋值,是不能赋值的,只能通过构造函数间接的为其赋值。
原文:http://blog.csdn.net/luckyzhoustar/article/details/19292171