【美高梅开户网址】中布局与类VS结构,常见概念简述

C# 结构(Struct)

在 C#
中,结构是值类型数据结构。它使得一个单纯变量能够储存各类数据类型的相干数据。struct 关键字用于成立布局。

结构是用来表示四个笔录。固然你想跟踪教室中书的动态。您或许想跟踪每本书的以下属性:

  • Title
  • Author
  • Subject
  • Book ID

C# 结构的风味

你已经用了2个不难易行的名为 Books 的布局。在 C# 中的结构与守旧的 C 或 C++
中的结构不一。C# 中的结构有以下特点:

  • 组织可含蓄艺术、字段、索引、属性、运算符方法和事件。
  • 布局可定义构造函数,但不能够定义析构函数。可是,您不能够为协会定义默许的构造函数。默许的构造函数是电动定义的,且不能够被更改。
  • 与类分化,结构不能够几次三番其余的组织或类。
  • 布局不能够当做任何组织或类的根基结构。
  • 布局可实现三个或五个接口。
  • 协会成员无法内定为 abstract、virtual 或 protected。
  • 当你使用 New 操作符创造1个协会对象时,会调用适当的构造函数来创制布局。与类区别,结构能够不利用
    New 操作符即可被实例化。
  • 倘若不使用 New
    操作符,只有在全部的字段都被起头化之后,字段才被赋值,对象才被利用。

    struct Books
    {
       public string title;
       public string author;
       public string subject;
       public int book_id;
    };  
    

    【美高梅开户网址】中布局与类VS结构,常见概念简述。类 vs 结构

    类和组织有以下几个为主的不相同点:

    • 类是援引类型,结构是值类型。
    • 结构不协理继承。
    • 布局不可能宣称暗中同意的构造函数。

      public void getValues(string t, string a, string s, int id)
      {

        title = t;
        author = a;
        subject = s;
        book_id = id;
      

      }

     

美高梅开户网址,1、C#的值类型

1、C#的值类型

概念结构

为了定义三个构造,您不可能不采用 struct 语句。struct
语句为程序定义了2个包括八个分子的新的数据类型。

譬如说,您能够依据如下的方式声明 Book 结构

struct Books
{
   public string title;
   public string author;
   public string subject;
   public int book_id;
};  

下面包车型大巴程序演示了协会的用法:

using System;

struct Books
{
   public string title;
   public string author;
   public string subject;
   public int book_id;
};  

public class testStructure
{
   public static void Main(string[] args)
   {

      Books Book1;        /* 声明 Book1,类型为 Book */
      Books Book2;        /* 声明 Book2,类型为 Book */

      /* book 1 详述 */
      Book1.title = "C Programming";
      Book1.author = "Nuha Ali"; 
      Book1.subject = "C Programming Tutorial";
      Book1.book_id = 6495407;

      /* book 2 详述 */
      Book2.title = "Telecom Billing";
      Book2.author = "Zara Ali";
      Book2.subject =  "Telecom Billing Tutorial";
      Book2.book_id = 6495700;

      /* 打印 Book1 信息 */
      Console.WriteLine( "Book 1 title : {0}", Book1.title);
      Console.WriteLine("Book 1 author : {0}", Book1.author);
      Console.WriteLine("Book 1 subject : {0}", Book1.subject);
      Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);

      /* 打印 Book2 信息 */
      Console.WriteLine("Book 2 title : {0}", Book2.title);
      Console.WriteLine("Book 2 author : {0}", Book2.author);
      Console.WriteLine("Book 2 subject : {0}", Book2.subject);
      Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);       

      Console.ReadKey();

   }
}

当下边包车型大巴代码被编写翻译和执行时,它会发生下列结果:

美高梅开户网址 1

有多少个特色:

有几个特征:

C# 结构的本性

您曾经用了二个简易的名为 Books 的组织。在 C# 中的结构与观念的 C 或 C++
中的结构不一。C# 中的结构有须臾间特点:

  • 结构可含蓄艺术、字段、索引、属性、运算符方法和事件。
  • 协会可定义构造函数,但不可能定义析构函数。不过,您不可能为结构定义暗中认可的构造函数。暗中认可的构造函数是半自动定义的,且无法被改成。
  • 与类差别,结构不可能再三再四其余的结构或类。
  • 组织不能看做其它协会或类的基本功结构。
  • 协会可完毕三个或八个接口。
  • 结构成员不可能内定为 abstract、virtual 或 protected。
  • 当您使用 New 操作符创制一个结构对象时,会调用适当的构造函数来成立布局。与类分化,结构能够不行使
    New 操作符即可被实例化。
  • 万一不利用 New
    操作符,唯有在具有的字段都被起始化之后,字段才被赋值,对象才被采取。
  • 仓库储存在栈里
  • 依照值类型的变量直接包涵值。
    将三个值类型变量赋给另多个值类型变量时,将复制包括的值。
    那与引用类型变量的赋值区别,引用类型变量的赋值只复制对指标的引用,而不复制对象自我。
  • 不无的值类型均隐式派生自 System.ValueType。
  • 与引用类型不一致,无法从值类型派生出新的品类。
    但与引用类型相同的是,结构也能够兑现接口。
  • 与引用类型分化,值类型不恐怕包含 null 值。 不过,能够为 null 的花色
    功效允许值类型分配给 null。
  • 每个值类型均有三个隐式的暗许构造函数来初步化该品种的默许值。
  • 存款和储蓄在栈里 
  • 基于值类型的变量直接包罗值(值类型存款和储蓄实际值)。
    将贰个值类型变量赋给另八个值类型变量时,将复制包罗的值。
    这与引用类型变量的赋值分裂,引用类型变量的赋值只复制对目的的引用,而不复制对象自作者。
  • 抱有的值类型均隐式派生自 System.ValueType。
  • 与引用类型分歧,不可能从值类型派生出新的种类。
    但与引用类型相同的是,结构也得以兑现接口。
  • 与引用类型不相同,值类型不恐怕包括 null 值。 可是,能够为 null 的品种
    功效允许值类型分配给 null。
  • 每一个值类型均有一个隐式的暗许构造函数来初阶化该类型的默许值。

类 vs 结构

类和结构有以下多少个基本的不一致点:

  • 类是援引类型,结构是值类型。
  • 组织不帮忙继承。
  • 结构不能够宣称暗中同意的构造函数。

本着上述议论,让大家重写前边的实例:

using System;

struct Books
{
    private string name;
    private string title;
    private string author;
    private string subject;
    private int book_id;
    public void getValues(string n,string t, string a, string s, int id)
    {
        name = n;
        title = t;
        author = a;
        subject = s;
        book_id = id;
    }
    public void display()
    {
        Console.WriteLine("{0}",name);
        Console.WriteLine("Title : {0}", title);
        Console.WriteLine("Author : {0}", author);
        Console.WriteLine("Subject : {0}", subject);
        Console.WriteLine("Book_id :{0}", book_id);
    }

};

public class testStructure
{
    public static void Main(string[] args)
    {

        Books Book1 = new Books(); /* 声明 Book1,类型为 Book */
        Books Book2 = new Books(); /* 声明 Book2,类型为 Book */

        /* book 1 详述 */
        Book1.getValues("book1","C Programming",
        "Nuha Ali", "C Programming Tutorial", 6495407);

        /* book 2 详述 */
        Book2.getValues("book2","Telecom Billing",
        "Zara Ali", "Telecom Billing Tutorial", 6495700);

        /* 打印 Book1 信息 */
        Book1.display();

        /* 打印 Book2 信息 */
        Book2.display();

        Console.ReadKey();

    }
}

 

位置的代码是在books结构中定义了五个艺术getvalues和display,在程序运行时调用Books里面包车型大巴display方法

当上边的代码被编写翻译和推行时,它会发出下列结果:

美高梅开户网址 2

 

值类型分为两类:
struct( 结构 )、
enum(枚举 )

 

struct( 结构 )分为以下几类:

值类型分为两类:
struct( 结构
)、 enum(枚举 )

  • Numeric类型

    • 整型

    • 浮点型

struct( 结构 )分为以下几类:

-    decimal 
  • Numeric(数值)类型

    • 整型

    • 浮点型

    • decimal

  • bool

  • 用户定义的协会。

  • bool

  • 用户定义的结构。

下表列出了 C# 中放到类型中可用的值类型:

下表列出了 C# 中置放类型中可用的值类型:

类型 描述 范围 默认值
bool 布尔值 True 或 False False
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U +0000 到 U +ffff ‘\0’
decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位双精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数类型 -923,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数类型 0 到 65,535 0
类型 描述 范围 默认值
bool 布尔值 True 或 False False
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U +0000 到 U +ffff ‘\0’
decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位双精度浮点型 5.0 x 10-324 到 1.7 x 10308 0.0D
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数类型 -923,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数类型 0 到 65,535 0

实则是简约类型,全部的简要类型(C# 语言的组成都部队分)均为 .NET
Framework 系统项指标小名。 例如,int 是 System.Int32
的别称。可选择文字发轫化简单类型。 例如,“A”是 char 类型的文字,而 贰零零叁是 int
类型的文字。如需获得八个类型或一个变量在一定平台上的准确尺寸,能够运用
sizeof 方法。表达式 sizeof(type)
发生以字节为单位存款和储蓄对象或项指标积存尺寸。上面举例获取其它机器上 int
类型的囤积尺寸:

实际是简约类型,全部的简便类型(C# 语言的组成都部队分)均为 .NET
Framework 系统项目的别称。 例如,int 是 System.Int32
的别名。可应用文字初步化简单类型。 例如,“A”是 char 类型的文字,而 二零零零是 int
类型的文字。如需得到3个项目或多少个变量在一定平台上的准确尺寸,能够动用
sizeof 方法。表明式 sizeof
爆发以字节为单位存储对象或项指标蕴藏尺寸。上面举例获取其他机器上 int
类型的储存尺寸:

 1 namespace DataTypeApplication
 2 {
 3    class Program
 4    {
 5       static void Main(string[] args)
 6       {
 7          Console.WriteLine("Size of int: {0}", sizeof(int));
 8          Console.ReadLine();
 9       }
10    }
11 }
 1 namespace DataTypeApplication 2 { 3    class Program 4    { 5       static void Main(string[] args) 6       { 7          Console.WriteLine("Size of int: {0}", sizeof(int)); 8          Console.ReadLine(); 9       }10    }11 }

当上边的代码被编译和施行时,它会发出下列结果:

当上边包车型大巴代码被编写翻译和推行时,它会产生下列结果:

Size of int: 4
Size of int: 4

 

2、 C# 的 struct

 

struct经常作为一小组相关变量的器皿,在 C#
中它使得一个纯粹变量能够储存各个数据类型的有关数据。struct
关键字用于创建结构体,可以依照如下的章程宣示 Person结构:

2、 C# 的 struct

1 struct Person2 {3    public string name;4    public int age;5    public string sex;6 };  

struct(结构)经常作为一小组相关变量的容器,在 C#
中它使得1个单纯变量能够储存各类数据类型的有关数据。struct
关键字用于创制结构体,能够遵从如下的方法宣示 Person结构:

上边包车型地铁次序演示了结构的用法:

1 struct Person
2 {
3    public string name;
4    public int age;
5    public string sex;
6 };  
using System;

namespace MyStruct
{
 struct Person
 {
 public string name;
 public int age;
 public string sex;
 }

 class Program
 {
 static void Main(string[] args)
 {
 Person person1;
 person1.name = "张三";
 person1.age = 18;
 person1.sex = "男";

 Person person2;
 person2.name = "李四";
 person2.age = 20;
 person2.sex = "男";

 //输出 person1 的信息
 Console.WriteLine("person1 姓名:{0}", person1.name);
 Console.WriteLine("person1 性别:{0}", person1.sex);
 Console.WriteLine("person1 年龄:{0}", person1.age);

 //输出 person2 的信息
 Console.WriteLine("person2 姓名:{0}", person2.name);
 Console.WriteLine("person2 性别:{0}", person2.sex);
 Console.WriteLine("person2 年龄:{0}", person2.age);

 Console.Read();
 }
 }
}

上边包车型客车先后演示了组织的用法:

当上面的代码被编写翻译和进行时,它会发出下列结果:

using System;

namespace MyStruct
{
    struct Person
    {
        public string name;
        public int age;
        public string sex;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person person1;
            person1.name = "张三";
            person1.age = 18;
            person1.sex = "男";

            Person person2;
            person2.name = "李四";
            person2.age = 20;
            person2.sex = "男";

            //输出 person1 的信息
            Console.WriteLine("person1 姓名:{0}", person1.name);
            Console.WriteLine("person1 性别:{0}", person1.sex);
            Console.WriteLine("person1 年龄:{0}", person1.age);

            //输出 person2 的信息
            Console.WriteLine("person2 姓名:{0}", person2.name);
            Console.WriteLine("person2 性别:{0}", person2.sex);
            Console.WriteLine("person2 年龄:{0}", person2.age);

            Console.Read();
        }
    }
}
person1 姓名:张三person1 性别:男person1 年龄:18person2 姓名:李四person3 性别:男person4 年龄:20

 

协会与类具有许多均等的语法,但社团比类受到的界定更加多:

当上面的代码被编写翻译和实践时,它会产生下列结果:

  • 协会可含蓄艺术、字段、索引、属性、运算符方法和事件。
  • 协会不能够声称暗中同意构造函数(没有参数的构造函数)或终结器。
  • 结构得以证明具有参数的构造函数。
  • 二个构造无法继续自另3个协会或类,并且它无法为类的基类。
  • 结构可完结两个或三个接口。
  • 布局成员无法钦定为 abstract、virtual 或 protected。
  • 与类不一样,无需使用 new 运算符即可对组织实行实例化。
  • 假设不采纳 New
    操作符,唯有在富有的字段都被开端化之后,字段才被赋值,对象才被选取。
person1 姓名:张三
person1 性别:男
person1 年龄:18
person2 姓名:李四
person3 性别:男
person4 年龄:20

多提一下:可将协会类型强制转换为接口类型,这将招致“装箱”操作,以将协会包装在托管堆上的引用类型对象内。
当将值类型传递到接受 Object
作为输入参数的办法时,将发生装箱操作。详细的会在前面装箱和裁撤装箱表达。

 

C# 的 enum

布局与类具有众多同等的语法,但结构比类受到的限量更多:

枚举类型为定义一组能够赋给变量的命名整数常量提供了一种有效的主意。
例如,就算您必须定义3个变量,该变量的值表示一周中的一天。
该变量只可以存款和储蓄八个有意义的值。
若要定义这个值,能够运用枚举类型。枚举类型是使用 enum 关键字表明的:

  • 结构可含蓄艺术、字段、索引、属性、运算符方法和事件。
  • 结构无法宣称默许构造函数(没有参数的构造函数)或终结器。
  • 结构得以注明具有参数的构造函数。
  • 贰个社团不恐怕继续自另2个布局或类,并且它不能够为类的基类。
  • 结构可达成二个或五个接口。
  • 结构成员不可能钦赐为 abstract、virtual 或 protected。
  • 与类分裂,无需使用 new 运算符即可对组织举行实例化。
  • 若果不使用 New
    操作符,唯有在装有的字段都被初阶化之后,字段才被赋值,对象才被利用。
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

多提一下:可将组织类型强制转换为接口类型,那将招致“装箱”操作,以将组织包装在托管堆上的引用类型对象内。
当将值类型传递到接受 Object
作为输入参数的形式时,将发出装箱操作。详细的会在背后装箱和撤回装箱表明。

私下认可境况下,枚举中每一个元素的基础项目是 int。
能够使用冒号内定另一种整数值类型,如前方的以身作则所示。准许使用的花色有
byte、sbyte、short、ushort、int、uint、long 或 ulong。

 

平凡状态下,最佳是在命名空间内直接定义枚举,以便该命名空间中的全数类都能够平等有益地访问它。
可是,还足以将枚举嵌套在类或结构中。
暗中同意情状下,第四个枚举数的值为 0,前边每种枚举数的值依次递增 1。
例如,下边包车型地铁枚举,Sat 是 0,Sun 是 1,Mon 是 2 等。

C# 的 enum 

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

枚举类型(也称之为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的不二法门。
例如,假使您必须定义2个变量,该变量的值表示一周中的一天。
该变量只可以存款和储蓄八个有含义的值。
若要定义那么些值,能够运用枚举类型。枚举类型是应用 enum 关键字证明的:

如上边包车型客车以身作则所示枚举数可用开头值来重写暗中同意值。

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

 

在此枚举中,强制因素系列从1而不是0初叶。可是,一般提出那样使用。注,枚举数的称号中不能够包罗空白。

默许景况下,枚举中各类成分的功底项目是 int。
能够行使冒号钦定另一种整数值类型,如前方的言传身教所示。准许使用的档次有
byte、sbyte、short、ushort、int、uint、long 或 ulong。

只要变量
meetingDay 的门类为 Days,则只好将 Days 定义的某部值赋给它。
要是会议日期变动,能够将 Days 中的新值赋给 meetingDay:

 

Days meetingDay = Days.Monday;//...meetingDay = Days.Friday;

一般说来情形下,最棒是在命名空间内向来定义枚举,以便该命名空间中的全数类都能够平等有益地访问它。
不过,还足以将枚举嵌套在类或协会中。
暗许情状下,第三个枚举数的值为 0,前边各个枚举数的值依次递增 1。
例如,下边包车型地铁枚举,Sat 是 0,Sun 是 1,Mon 是 2 等。

能够将轻易整数值赋给meetingDay。例如,代码行meetingDay
= 42不会时有爆发错误。但也不该那样做,因为暗许约定的是枚举变量只容纳枚举定义的值之一。将任意值赋给枚举类型的变量很有可能会招致错误。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

上边包车型客车实例演示了枚举变量的用法:

 

using System;namespace MyEnum{    class Program    {        enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };        static void Main(string[] args)        {            int WeekdayStart = (int)Days.Mon;            int WeekdayEnd = (int)Days.Fri;            Console.WriteLine("Monday: {0}", WeekdayStart);            Console.WriteLine("Friday: {0}", WeekdayEnd);                        Console.Read();        }    }}

 

当上边的代码被编写翻译和推行时,它会时有发生下列结果:

如下边包车型客车演示所示枚举数可用开始值来重写暗许值。

Monday: 1Friday: 5
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

类别源码下载:

 在此枚举中,强制因素连串从 1 而不是 0 初阶。 可是,一般提出那样使用。注,枚举数的称谓中无法包罗空白。


 

C#基础,目录

一旦变量
meetingDay 的品种为 Days,则只可以将 Days
定义的某些值赋给它(无需显式强制转换)。 假使会议日期变更,可以将 Days
中的新值赋给 meetingDay:

上一篇:4、C#基础 – C# 的 常见概念简述

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;

下一篇:

 能够将随机整数值赋给 meetingDay。 例如,代码行 meetingDay = (Days)
42 不会发出错误。 但也不应该这么做,因为私下认可约定的是枚举变量只容纳枚举定义的值之一。 将任意值赋给枚举类型的变量很有可能会造成错误。
 
上面的实例演示了枚举变量的用法:

using System;

namespace MyEnum
{
    class Program
    {
        enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
        static void Main(string[] args)
        {
            int WeekdayStart = (int)Days.Mon;
            int WeekdayEnd = (int)Days.Fri;
            Console.WriteLine("Monday: {0}", WeekdayStart);
            Console.WriteLine("Friday: {0}", WeekdayEnd);

            Console.Read();
        }
    }
}

 

当上边的代码被编译和施行时,它会发出下列结果:

Monday: 1
Friday: 5

品种源码下载:


 

C#基础,目录

上一篇:4、C#基础 – C# 的
常见概念简述

下一篇:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图