C#类与结构再次详解

类和结构是 .NET Framework 中的常规类型系统的两种基本构造。  两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。  数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等(本主题后面列出了这些内容)。

类或结构的声明类似于蓝图,用于在运行时创建实例或对象。  如果定义一个名为 Person 的类或结构,则 Person 为类型名称。  如果声明并初始化 Person 类型的变量 p,则 p 称为 Person 的对象或实例。  可以创建同一 Person 类型的多个实例,每个实例在其属性和字段中具有不同的值。

类是一种“引用类型”。  创建类的对象时,对象赋值到的变量只保存对该内存的引用。  将对象引用赋给新变量时,新变量引用的是原始对象。  通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。

结构是一种值类型。  创建结构时,结构赋值到的变量保存该结构的实际数据。  将结构赋给新变量时,将复制该结构。  因此,新变量和原始变量包含同一数据的两个不同的副本。  对一个副本的更改不影响另一个副本。

类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。  结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。

下面的示例在 ProgrammingGuide 命名空间的顶级使用三个成员定义了 MyCustomClass。  在 Program 类的 Main 方法中创建了 MyCustomClass 的一个实例(对象),并使用点表示法访问该对象的方法和属性。

namespace ProgrammingGuide
    {    // Class definition.
        public class MyCustomClass
        { // Class members:
          // Property.
            public int Number { get; set; }            // Method.
            public int Multiply(int num)
            {                return num * Number;
            }            
            // Instance Constructor.
            public MyCustomClass()
            {
                Number = 0;
            }
        }       
            // Another class definition. This one contains
            // the Main method, the entry point for the program.
        class Program
        {    static void Main(string[] args)
            {                
            // Create an object of type MyCustomClass.
                MyCustomClass myClass = new MyCustomClass();             
              // Set the value of a public property.
                myClass.Number = 27;              
                // Call a public method.
                int result = myClass.Multiply(4);
            }
        }
    }

封装

“封装”有时被称为面向对象的编程的第一个支柱或原则。  根据封装的原则,类或结构可以指定其每个成员对于该类或结构外部的代码的可访问性。  可将无意在类或程序集外部使用的方法和变量隐藏起来,以减小编码错误或遭恶意利用的可能性。

有关类的更多信息,请参见对象

成员

所有方法、字段、常量、属性和事件都必须在类型内部进行声明;这些称为类型的“成员”。  与其他一些语言不同的是,C# 中没有全局变量或方法。  即使是作为程序入口点的 Main 方法也必须在类或结构内部进行声明。  下表列出了可在类或结构中声明的所有不同种类的成员。

辅助功能

有些方法和属性要供类或结构外部的代码(称为“客户端代码”)调用或访问。  另有一些方法和属性可能仅供类或结构在自身内部使用。  应限制您的代码的可访问性,只允许应当访问它们的客户端代码进行访问,这一点十分重要。  使用访问修饰符 publicprotectedinternalprotected internalprivate 可以指定类型及其成员对于客户端代码的可访问性。  默认可访问性为 private。  有关详细信息,请参阅 访问修饰符

Inheritance

类(而非结构)支持继承的概念。  派生自另一个类(“基类”)的类将自动包含基类除构造函数和析构函数之外的所有公共、受保护和内部成员。  有关更多信息,请参见继承多态性

可以将类声明为抽象类,表示该类的一个或多个方法不具有实现。  抽象类虽然无法直接实例化,但可以用作其他类的基类,由其他类提供缺少的实现。  还可以将类声明为密封类,以禁止其他类从该类继承。  有关详细信息,请参阅 抽象类、密封类及类成员

接口

类和结构可以继承多个接口。  从接口继承意味着该类型要实现该接口中定义的所有方法。  有关详细信息,请参阅 接口

泛型类型

可以使用一个或多个类型参数来定义类和结构。  客户端代码在创建类型的实例时提供类型。  例如,System.Collections.Generic 命名空间中的 List<T> 类使用一个类型参数进行定义。  客户端代码创建 List<string>List<int> 的实例来指定列表中将包含的类型。  有关详细信息,请参阅 泛型

静态类型

可以将类(不是结构)声明为静态。  静态类只能包含静态成员,不能使用 new 关键字进行实例化。  在程序加载时,静态类的一个副本将加载到内存中,可通过类名称访问该类的成员。  类和结构都可以包含静态成员。  有关详细信息,请参阅 静态类和静态类成员

嵌套类型

类或结构可以嵌套在其他类或结构中。  有关更多信息,请参见嵌套类型

分部类型

可以在一个代码文件中定义类、结构或方法的一部分,而在另一个代码文件中定义另一部分。  有关更多信息,请参见分部类和方法

对象初始值设定项

可以实例化和初始化类或结构对象以及对象的集合,无需显式调用其构造函数。  有关更多信息,请参见对象和集合初始值设定项

匿名类型

在不方便或没必要创建命名类的情况下,例如当使用无需保留或传递给其他方法的数据结构填充列表时,可以使用匿名类型。  有关更多信息,请参见匿名类型

扩展方法

通过创建一个单独的类型,然后将该类型的方法当作原始类型的方法来调用,可以在不必创建派生类的情况下对类进行“扩展”。  有关更多信息,请参见扩展方法

隐式类型化局部变量

在类或结构方法中,可以使用隐式类型来指示编译器在编译时确定正确的类型。  有关更多信息,请参见隐式类型的局部变量

摘自:https://msdn.microsoft.com/zh-cn/library/ms173109.aspx

时间: 2024-10-13 13:00:10

C#类与结构再次详解的相关文章

Android目录结构(详解)

Android目录结构(详解) 下面是HelloAndroid项目在eclipse中的目录层次结构: 由上图可以看出项目的根目录下共有九个文件(夹),下面就这九个文件(夹)进行详解: 1.1src文件夹和assets文件夹: 每个Android程序都包含资源目录(src)和资产目录(assets),资源和资产听起来感觉没有多大差别,但在存储外部内容时用资源(src)比较多,其中它们的区别在于存放在资源(src)下的内容可以通过应用程序的R类进行访问,而存放在资产(assets)下的内容会保持原始

Java AtomicInteger类的使用方法详解_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private s

NetBios 的结构体详解(网络控制块NCB)

对之前网络基础编程用到控制块NCB进行介绍(补充): 在Win32环境下,使用VC++6.0进行NetBIOS程序开发时, 需要用到nb30.h文件和netapi32.lib静态链接库.前者定义了NetBIOS的所有函数声明和常数定义,后者定义了NetBIOS应用. Ncb的结构在nb30.h文件中定义.Ncb结构的定义:Ncb有64个字符,分为14个域(或称为字段)和一个10字节的保留域,表2.1显示了Ncb和它的域. 域名及字节偏移量说明. 各个命令详细说明: 1. 命令 NetBIOS命令

NetBios 的结构体详解

[NetBios 的结构体详解] 1.结构体. 2.命令 NetBIOS命令的使用方式有两种,即等待和非等待(或称为同步与异步)方式. 如果命令码的高阶位是0时是等待方式,命令将阻止提交命令的应用程序继续执行,直到该NetBIOS命令执行完毕后才允许这个应用程序继续执行.NetBIOS每次只能处理一个等待方式命令. 如果命令码的高阶位是二进制1时则是非等待方式,命令由NetBIOS在内部排队,并不阻止提交命令的应用程序继续执行.应用程序可通过对命令结束标志字段值的轮询来了解命令执行的状态(详见命

Asp.Net SignalR Hub类中的操作详解

Asp.Net SignalR Hub类中的操作详解 Hub类中的操作 在服务端我们要通过Hub类做一系列操作,下面就说说我们都可以做什么操作 客户端的发送消息操作 调用所有的客户端的helloClient方法 Clients.All.helloClient(); 调用除了给定ConnectionId的客户端之外的所有客户端的helloClient方法 Clients.AllExcept(Context.ConnectionId).helloClient(); 调用指定的connectionId

Android之TextView的样式类Span的使用详解

Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现,我们可以通过Android提供的 SpannableString类封装.Android提供了很多的Span的类去实现样式,这个样式都是继承自CharacterStyle类. 要想理解Span的具体使用,那肯定得了解SPan类群的构成,研究代码继承结构,深入的了解.理解,才能更好的使用它.我们来统计一下,最前端的可用功能的SPAN有:URLSpan.Clicka

【转】Java 类的生命周期详解

一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区

struct结构体详解

为什么要有结构体 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型.以方便日后的使用. 在实际项目中,结构体是大量存在的.研发人员常使用结构体来封装一些属性来组成新的类型.由于C语言内部程序比较简单,研发人员通常使用结构体创造新的"属性",其目的是简化运算. 结构体在函数中的作用不是简便,其最主要的作用就是封装.封装的好处就是可以再次利用.让使用者不必关心这个是什么,只要根据定义使用就可以了. 在C语言中,可以定义结构体类型,将多个相

100. NSScanner类条件判断利器详解

简介 NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符. NSScanner官方文档 NSScanner类是一个类簇的抽象父类,该类簇为一个从NSString对象扫描值的对象提供了程序接口. NSScanner对象把NSString 对象的的字符解释和转化成 number和string 类型的值.在创建NSScanner对象的