zoukankan      html  css  js  c++  java
  • C#结构的学习 分类: C# 20130110 17:18 456人阅读 评论(0) 收藏

    结构是程序员定义的数据类型,非常的类似于类。有数据成员和函数成员。

    但是也有区别:

    1)类是引用类型,而结构是值类型;

    2)结构是隐式密封的,不能被派生;

    语法声明与类相似:

    //结构的声明
            struct StructName
            {
                //包含的成员变量
            }

    看下边的示例代码来演示C#结构的使用方法:

    static void Main(string[] args)
            {
                Point first, second, third;
                first.x = 10; first.y = 10;
                second.x = 20; second.y = 20;
                third.x = first.x + second.x;
                third.y = first.y + second.y;
    
                Console.WriteLine("first:{0},{1}",first.x,first.y);
                Console.WriteLine("second:{0},{1}",second.x,second.y);
                Console.WriteLine("third:{0},{1}",third.x,third.y);
                Console.ReadKey();
            }
    
            struct Point
            {
                public int x;
                public int y;
            }
    结构是值类型

    1)结构类型的变量不能使null;

    2)两个结构变量不能引用同一对象

    static void Main(string[] args)
            {
                CSimple cs1 = new CSimple(),cs2=null;
                Simple ss1 = new Simple(),ss2=new Simple();
    
                cs1.x = ss1.x = 5;
                cs1.y = ss1.y = 10;
                cs2 = cs1;   //赋值类实例
                ss2 = ss1;   //赋值结构实例
    
            }
    
            class CSimple
            {
                public int x;
                public int y;
            }
    
            struct Simple
            {
                public int x;
                public int y;
            }
    先创建一个CSimple类,和一个Simple结构

    在Main()分别对它们实例化声明两个个变量后,cs1和cs2分别指向在堆中的引用,而ss1和ss2分别在栈中分配空间并存储。
    把一个结构赋值给另外一个结构,就是从一个结构中把值复值给另外一个结构。与类不同的是,复制类变量时只有引用被复制。

    如上面的代码,类赋值结束后,cs2和cs1指向堆中的同一个对象。但是在结构赋值结束后,ss2成员的值和ss1成员的值相同。


    结构中的构造函数和析构函数

    语言隐式的为每个结构提供一个无参数的构造函数。这个构造函数把结构的每个成员设置为该类型的默认值,引用成员被设置成null

    预定义的无参数构造函数对每个结构都存在,而且不能删除或者重新定义。但是可以创建另外的构造函数,只要他们有参数。这和类不同,对于类,编译器只在没有其它构造函数声明时提供隐式的无参数构造函数。

    要调用一个构造函数,包括隐式的无参数构造函数,要使用new运算符。即使不从堆中分配内存也使用new运算符。

    如下面的实例:

     static void Main(string[] args)
            {
    
                Simple s1 = new Simple();  //调用隐式的构造函数
                Simple s2 = new Simple(5, 10);  //调用构造函数
                Console.WriteLine("{0},{1}",s1.x,s1.y);
                Console.WriteLine("{0},{1}", s2.x, s2.y);
                
                Console.ReadKey();
            }
    
            struct Simple
            {
                public int x;
                public int y;
    
                public Simple(int a, int b)
                {
                    x = a;
                    y = b;
                }
            }
    也可以不适用new运算符创建结构的实例。但是,有一些限制:

    1)不能使用数据成员的值,直到显示的设置它

    2)不能调用任何函数成员,直到所有数据成员已经被赋值

    static void Main(string[] args)
            {
    
                Simple s1, s2;
                Console.WriteLine("{0},{1}", s1.x, s1.y);//编译错误,s1.x, s1.y还没有被赋值
    
                s2.x = 50;
                s2.y = 10;
                Console.WriteLine("{0},{1}", s2.x, s2.y);
    
          
                Console.ReadKey();
            }
    
            struct Simple
            {
                public int x;
                public int y;
            }


    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    [DB] 数据库的连接
    JS leetcode 翻转字符串里的单词 题解分析
    JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
    JS leetcode 搜索插入位置 题解分析
    JS leetcode 杨辉三角Ⅱ 题解分析
    JS leetcode 寻找数组的中心索引 题解分析
    JS leetcode 移除元素 题解分析
    JS leetcode 最大连续1的个数 题解分析
    JS leetcode 两数之和 II
    JS leetcode 反转字符串 题解分析
  • 原文地址:https://www.cnblogs.com/yisuowushinian/p/4715638.html
Copyright © 2011-2022 走看看