C#结构体

转载 2012年03月22日 10:07:31
结构体的定义:

结构体也可以象类一样可以单独定义.
class  a{};
struct a{};

结构体也可以在名字前面加入控制访问符.
public struct student{};
internal struct student{};

如果结构体student没有publice或者internal的声明 类program就无法使用student结构定义 obj对象
如果结构体student的元素没有public的声明,对象obj就无法调用元素x
因为默认的结构体名和元素名是private类型
程序:
using System;
public struct student
    {
       public int x;
    };

class program
{
    public static void Main()
    {
     student obj=new student();
     obj.x=100;       
    }

};
在结构体中也可以定义静态成员与类中一样,使用时必须用类名,或结构名来调用不属于实例,声明时直接定义.
程序:
using System;
public struct student
    {
     public static int a = 10;
    };
class exe
{
 public static void Main()
    {
     Console.WriteLine( student.a = 100);
    }
};
或
using System;
class base
{
public struct student
    {
     public static int a = 10;
    };
}
class exe
{
 public static void Main()
    {
     Console.WriteLine( base.student.a = 100);
    }
};
在结构体中可以定义构造函数以初始化成员,但不可以重写默认无参构造函数和默认无参析构函数
程序:
public struct student
    {
       public int x;
       public int y;
       public static int z;
       public student(int a,int b,int c)
        {
            x=a;
            y=b;
         student.z=c;
        }

    };
在结构体中可以定义成员函数。
程序:
public struct student
    {
       public void list()
            {
Console.WriteLine("这是构造的函数");
            }

     };
结构体的对象使用new运算符创建(obj)也可以直接创建单个元素赋值(obj2)这是与类不同的因为类只能使用new创建对象
程序:
public struct student
    {
       public int x;
       public int y;
       public static int z;
       public student(int a,int b,int c)
        {
            x=a;
            y=b;
         student.z=c;
        }

    };
class program
{
 public static void Main()
{
  student obj=new student(100,200,300);
  student obj2;
  obj2.x=100;
  obj2.y=200;
  student.z=300;
}
}

在使用类对象和函数使用时,使用的是引用传递,所以字段改变
在使用结构对象和函数使用时,是用的是值传递,所以字段没有改变

程序:
using System;
class class_wsy
{
    public int x;
}
struct struct_wsy
{
    public int x;
}
class program
{
    public static void class_t(class_wsy obj)
    {
        obj.x = 90;
    }
    public static void struct_t(struct_wsy obj)
    {
        obj.x = 90;
    }
    public static void Main()
    {
        class_wsy obj_1 = new class_wsy();
        struct_wsy obj_2 = new struct_wsy();
        obj_1.x = 100;
        obj_2.x = 100;
        class_t(obj_1);
        struct_t(obj_2);
        Console.WriteLine("class_wsy obj_1.x={0}",obj_1.x);
        Console.WriteLine("struct_wsy obj_2.x={0}",obj_2.x);
        Console.Read();
    }
}
结果为:class_wsy obj_1.x=90
       struct_wsy obj_2.x=100


 

说说struct。对于struct,在一定程度上与class非常相像,分析一下:

    class program

    {

        static void Main(string[] args)

        {

            STR str1;

            str1.Method("str1");//第一种方法,直接定义

 

            STR str2 = new STR();

            str2.Method("str2"); //第二种方法,通过new关键字

        } 

    }

    struct STR

    {

        public void Method(string Par)

        {

            Console.WriteLine("参数是:"+Par);

        }

}

一个是直接定义来调用,也可以通过new关键字来定义调用,这是与类不同的,类必需经过实例化(new)来定义调用(静态成员是通过类名调用,没有定义)。

接下来再看一个例子。

 class program

    {

        static void Main(string[] args)

        {

            STR str1;//第一种

            str1.count = 100;//赋值

            Console.WriteLine(str1.count);

 

            STR str2 = new STR();//第二种

            Console.WriteLine(str2.count); 

                   

        } 

    }

    struct STR

    {

      public int count;

}

当结构体中定义一个全局变量时(类中叫字段),这个count是没有值的,这是与类不同的,在类中,所有的字段都有默认值,结构中是没有的。既然没有默认值,那在第二种实例化直接调用时,str2.count输出的为什么是0,这个0是没有事前赋值的。如果是类,我们知道,类是有构造函数的,如果我们不显式写上构造函数,CLR会自动给我们加上一个没有参数的构造函数的,并且这个构造函数是可以被显式的写出来的。同样,结构也是有一个构造函数,但这个构造函数是不能够写出来的,并且这个构造函数很特别,从第二种就能看出,只要用new关键字来实例化结构,就会把count给初始化成0,也就是那个不能写出来的无参构造函数会初始化所有的结构中的全局变量。对于第一种,因为没有调用无参的构造函数,所以必需去显式的给结构中的全局变量去赋值。

如果结构里有有参构造函数,代码如下:

    class program

    {

        static void Main(string[] args)

        {

            STR str = new STR("");//实例化

            Console.WriteLine(str.count);

        } 

    }

    struct STR

    {

      public int count;

      public STR(string str)

      {

          count = 1;

      }

 }

会发现,如果是个有参构造函数,在构造中必需去初始化结构中的全局变量,因为如果用有参构造函数的话,无参的就不会得到调用,结构中的全局变量就得不到初始化,所以必需在有参构造函数中去初始化它。如果有多个全局变量,都得在这个有参构造函数中去实例化它们。


 

C#文件方式读写结构体探析

    最近一直在研究.Net Micro Framework字体文件(tinyfnt),由于tinyfnt文件头部有一段描述数据,所以很想定义一个结构体,像VC一样直接从文件中读出来,省得用流一个个...
  • yefanqiu
  • yefanqiu
  • 2007年12月22日 22:03
  • 4332

C#如何定义结构体及访问结构体的成员

构结构的关键字 struct,struct类型是一种值类型通常用来封装小型变量组,如果冲结构创建一个对象并将对象赋给某个变量 则变量包含结构该变量放入结构的全部值,如果复制包含变量的结构,则将该复制所...
  • u010159842
  • u010159842
  • 2016年06月15日 15:15
  • 5665

c# 存取结构体二进制文件

c# 存取结构体 二进制文件(转载)  from http://www.cnblogs.com/baishahe/archive/2010/03/18/1688995.html u...
  • angxiao
  • angxiao
  • 2012年04月20日 14:59
  • 1542

C# 结构体与类的区别

经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字...
  • liujunjie612
  • liujunjie612
  • 2017年05月03日 15:02
  • 451

C# struct(结构)与按值复制、按索引复制详解

本文讲解了struct的用法以及按值复制、按索引复制的不同。struct是结构(structure)的简写,struct看上去与类非常相似,它们也有字段和属性。...
  • u013180863
  • u013180863
  • 2015年09月23日 15:33
  • 1516

C#中结构体的应用

与C语言一样,C#中也有结构体,但C#中结构体与C语言结构体、C#中的类有以下异同点: (1)结构与类相似,都包含数据成员和结构成员; (2)结构是值类型,类是引用类型。二者的存储位置不...
  • iamzxf
  • iamzxf
  • 2015年04月21日 08:06
  • 730

C#中如何定义与C++定义的对应的结构体

1.C++中的结构体 #pragma pack(1) struct A { int a1;//属性a1 int a2;//属性a2 A() { a1= 0; a2= 0; } }...
  • hanhan122655904
  • hanhan122655904
  • 2014年12月22日 16:52
  • 2873

[C#]结构体和类的区别

 结构体和类的区别:     在做一个项目时,使用了较多的结构体,并且存在一些结构体的嵌套,即某结构体成员集合包含另一个结构体等,总是出现一些奇怪的错误,才终于下决心好好分析一下到底类和结构体...
  • Andrewniu
  • Andrewniu
  • 2016年08月02日 14:14
  • 849

C#文件流写入结构体

1、定义结构体 namespace WindowsFormsApplication1 {         [StructLayout(LayoutKind.Sequential, Pack = 1...
  • small5e4444
  • small5e4444
  • 2015年04月03日 16:22
  • 2634

C#结构体和字节数组的转换函数

在通信过程中,一般我们都会操作到字节数组.特别是希望在不同语言编程进行操作的时候. 虽然C#提供了序列化的支持,不用字节数组也行.但操作字节数组肯定会碰到. 一般都会采用结构来...
  • whd0310
  • whd0310
  • 2015年04月16日 09:54
  • 418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#结构体
举报原因:
原因补充:

(最多只允许输入30个字)