C#forUnity快速入门(连载13)-C#结构体

C# for Unity编程语言快速入门教程(连载13)_C#结构体


C#的“结构体”使用Struct 关键字来定义,是与“类”、"接口"并列的编程单位。其设计的主要目的是自定义“值类型”,即允许用户自定义值类型。


适用范围:
   结构适合一些小型的数据结构,这些结构包含的数据以创建后不修改的数据为主。也适合数据打包,一次性定义多个变量。

结构体的限制很多。
1> 除非字段声明为const 、static,否则无法初始化。
2> 结构体没有默认的构造函数。
3> 结构体可以声明带参数的构造函数。
4> 结构不能继承。
5> 结构体在赋值时候进行复制。
6> 结构体实例化可以不使用New 运算符。
7> 结构可以实现接口。

8> 结构体使用时,可以New ,也可以不New. 如果不New ,则使用前必须为结构体中所有的成员变量赋值。

对于C#初学者来说,对于结构体是不好区分的,现就结构体与类的主要区别总结如下:

1>  如果你需要用面向对象的特性,必须用类。

2>  成员变量很多的时候,必须用类。

3>  类与结构体的最大区别是:“类" 是引用类型,所以类的实例对象是按照“引用传值”,而"结构"类型是值类型,所以结构实例对象是按“值类型传值”。


为了更好的说明类与结构的异同点,现提供如下代码,供大家学习讨论:

class Program
    {

public void ChangeValues_1(int intNum)
        {
            intNum = 100;
        }

/// <summary>
        /// 测试类对象传值(引用)
        /// </summary>
        /// <param name="pc"></param>
        public void ChangeValues_2(PointClass pc)
        {
            pc.PointX = 1000;
            pc.PointY = 1100;
        }

/// <summary>
        /// 测试结构体传值(拷贝)
        /// </summary>
        /// <param name="ps"></param>
        public void ChangeValues_3(PointStruct ps)
        {
            ps.PointX = 2000;
            ps.PointY = 2200;
        }

static void Main(string[] args)
        {
            /* 引出学习案例(系统的“点”) */
            //Point firstPoint = new Point();
            //firstPoint.X = 10;
            //firstPoint.Y = 20;

/*类与结构体 不同点测试 */
            //引用类型
            PointClass pc = new PointClass(10,20);            
            //值类型
            PointStruct ps = new PointStruct(50,60); //写法1
            //写法2:特别注意,在使用结构中的方法或者属性前,
            //必须显式的给结构的字段赋值,否则必须用New.
            PointStruct ps2;  
            ps2._PointX = 23;
            ps2._PointY = 88;

Program obj = new Program();
            int intTestNum = 50;
            obj.ChangeValues_1(intTestNum);
            Console.WriteLine("Number=" + intTestNum);

//结果表明:引用类型,在方法中发生的变化,对结果造成的影响
            obj.ChangeValues_2(pc);

Console.WriteLine("pc.pointX={0},pointY={1}",pc.PointX,pc.PointY);

obj.ChangeValues_3(ps);
            Console.WriteLine("ps.pointX={0},pointY={1}", ps.PointX, ps.PointY);
        }
    }

//定义的类
    class PointClass
    {
        private int _PointX;
        private int _PointY;

public int PointX
        {
            get { return _PointX; }
            set { _PointX = value; }
        }
        public int PointY
        {
            get { return _PointY; }
            set { _PointY = value; }
        }

public PointClass(int px, int py)
        {
            _PointX = px;
            _PointY = py;
        }
    }

//定义的结构体
    struct PointStruct
    {
        public int _PointY;
        public int _PointX;

public int PointX
        {
            get { return _PointX; }
            set { _PointX = value; }
        }
        public int PointY
        {
            get { return _PointY; }
            set { _PointY = value; }
        }

public PointStruct(int px, int py)
        {
            _PointX = px;
            _PointY = py;
        }
    }

时间: 2024-08-09 06:32:08

C#forUnity快速入门(连载13)-C#结构体的相关文章

IOS开发语言Swift入门连载---类和结构体

IOS开发语言Swift入门连载-类和结构体 类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体中实现各种功能,我们必须要严格按照常量.变量以及函数所规定的语法规则来定义属性和添加方法. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意: 通常一个类 的实例被称为对象 .然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本

C#forUnity快速入门(连载15)_C#委托与事件

C# for Unity编程语言快速入门教程(连载15)_C#委托与事件 C#的委托(delegate)与事件(event)  其实不是一个容易理解的技术,而且很多C#书籍作者还经常把它与"观察者设计模式"(Observer模式)放在一起进行讨论(注:因为委托与事件是"Observer"设计模式的一种很好的实现方式),其实这就进一步增加了对于C#初学者的学习难度. 所以笔者打破常规,先从讲故事的方式,先来介绍"委托". 案例故事:"老板

C#forUnity快速入门(连载11)-C#的属性

C# for Unity编程语言快速入门教程(连载11)_C#的属性    C#的"属性"是一种类字段的约束控制手段,其直接目的就是控制字段的输入合法性,以及实现对字段的快速访问. 目的:     引入属性概念是为了更合理的控制对字段的可访问性.    规则1: 属性是方法的简化版,主要是用于对字段的控制.规则2: 属性本质就是Set 与Get 方法的简化.规则3: 属性可以写成只读属性.只写属性.规则4: 属性中如果不需要对字段做控制处理,可以简化写法. 因为这个概念相对比较简单,所

C#forUnity快速入门(连载12)-C#的字符串

C# for Unity编程语言快速入门教程(连载12)_C#的字符串 "C#字符串"是一个重要的知识点,对于C#初学者来说有很多重要知识点需要进行学习,总体归纳有三个大的方面: 知识点一:  字符串的常用方法与属性 属性:     Length:           得到字符串的长度   方法:    IsNullOrEmpty()   表示空字符串: IndexOf()  :           查找指定字符(子字符串). SubString():          字符串截取(得

【Android快速入门1】目录结构及adb命令(以API19为例)

目录结构 src: 存放java代码gen: 存放自动生成文件的. R.java 存放res文件夹下对应资源的idproject.properties: 指定当前工程采用的开发工具包的版本libs: 当前工程所依赖的jar包.assets: 放置一些程序所需要的媒体文件.bin: 工程的编译目录. 存放一些编译时产生的临时文件和当前工程的.apk文件. res(resources): 资源文件. drawable: 存放程序所用的图片. layout: 存放android的布局文件. fragm

C# for Unity快速入门(连载14)_C#枚举类型

C# for Unity编程语言快速入门教程(连载14)_C#枚举类型 C#的枚举类型(用 "enum"关键字标识),按照笔者理解本质上是一个隐式继承了System.Enum的整形类.枚举类型的主要作用是:为了更好的识别一个变量的具体含义,且固定变量的使用"范围". 例如:形如如下定义 public enum Week{   Monday,  Tuesday,  Wenesday,  Thursday,  Friday,  Saterday,  Sunday }  

AngularJS快速入门指南13:表单

一个AngularJS表单是一组输入型控件的集合. HTML控件 HTML输入型标签标包括: input标签 select标签 button标签 textarea标签 HTML表单 HTML表单将各种HTML控件组合到一起. 一个AngularJS表单的例子 <div ng-app="myApp" ng-controller="formCtrl"> <form novalidate> First Name:<br> <inp

[易学易懂系列|rustlang语言|零基础|快速入门|(13)]

有意思的基础知识 Generics泛型 我们今天来看看泛型. 什么是泛型? 我们来看看这样的情景: 我们要写一个函数,这个函数可以处理不同类型的值,但这个值的类型,在运行时,才由调用者确定. 我们不可能在函数方法中,一开始就写死. 那要什么办? 用泛型. 比如:用x : T替换x : u8 我们来看看例子: 泛型函数: fn takes_anything<T>(x: T) { // x has type T, T is a generic type } fn takes_two_of_the_

swift菜鸟入门视频教程-09-类和结构体

本人自己录制的swift菜鸟入门,欢迎大家拍砖,有什么问题能够在这里留言. 主要内容: 类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合(collection)类型的赋值与复制行为 视频地址: 百度网盘:http://pan.baidu.com/s/1ntLV2kT 土豆:http://www.tudou.com/programs/view/cbJBcBofxhs/ 源代码: http://download.csdn.net/detail/mengxiangyue/75