A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄晓波 黑马帝   /  2012-2-7 10:45  /  2799 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在C#中,可以声明结构和类~都可以在其中有变量、方法等~有何异同?

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

3 个回复

倒序浏览
不能为结构声明默认构造函数(一个无参数的构造函数).因为编译器始终会帮我们生成一个.在类中只有在没有自己写一个构造函数的前提下,编译器才会帮我们生成一个默认构造函数.在编译器为结构生成的默认构造函数中,总是将字段设为0,false或者null,这和类是一样的.然而,在自己写的一个构造函数中(再次提醒,这必须是一个非默认的构造函数),必须自己负责初始化所有字段,编译器不会再帮我们初始化它.这意味着必须在结构的所有非默认构造函数中显式地初始化所有字段,否则会造成编译时错误.例如,假定把Time换成一个类,那么下面的例子是能通过编译的,而且seconds会被悄悄地初始化为0.但是,由于Time是一个结构,所以它无法通过编译:
struct Time
             {
                 public Time(int hh, int mm)
                 {
                     hours = hh;
                     minutes = mm;
                     //seconds = 0;
                 }
                 public int hours, minutes, seconds;
  
             }
修改:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
  
namespace ConsoleApplication1
{
     class Program
     {
         static void Main(string[] args)
         {
             try
             {
                 Time time0 = new Time();
                 Console.WriteLine("{0}:{1}:{2}", time0.hours, time0.minutes, time0.seconds);
                 Time time1 = new Time(6, 25);
                 Console.WriteLine("{0}:{1}:{2}", time1.hours, time1.minutes, time1.seconds);
             }
             catch (Exception ex)
             {
                 Console.WriteLine(ex.Message);
             }
         }
  
  
  
             struct Time
             {
                 public Time(int hh, int mm)
                 {
                     hours = hh;
                     minutes = mm;
                     seconds = 0;
                 }
                 public int hours, minutes, seconds;
  
             }
      }
}


若是将Time声明为一个类,则可以不用将全部字段初始化,但是不会默认有无参数的构造函数,因此要自己写一个无参数的构造函数.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
  
namespace ConsoleApplication1
{
     class Program
     {
         static void Main(string[] args)
         {
             try
             {
                 Time time0 = new Time();
                 Console.WriteLine("{0}:{1}:{2}", time0.hours, time0.minutes, time0.seconds);
                 Time time1 = new Time(6, 25);
                 Console.WriteLine("{0}:{1}:{2}", time1.hours, time1.minutes, time1.seconds);
             }
             catch (Exception ex)
             {
                 Console.WriteLine(ex.Message);
             }
         }           
     }
     class Time
     {
         public Time()
         {
         }               //要定义无参数的构造函数,不会默认生成
        public Time(int hh, int mm)
         {
             hours = hh;
             minutes = mm;     
         }               //可以不必将所有字段都初始化,会默认初始化为0
         public int hours, minutes, seconds;
     }
}



作者“McDelfino”

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
存储的方式也不同,结构变量的数据存储在栈中,类对象存储在堆中,栈里面只是引用。

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马