一 类的概述(类是逻辑相关的数据和函数的封装,通常代表真实世界中或概念上的事物)

类是一种能存储数据并执行代码的数据结构,包含数据成员和函数成员。

数据成员存储类或类的实例相关的数据;

函数成员执行代码。


二 声明类

class MyClass
{
数据成员...(字段、常量)
函数成员...(方法、属性、构造函数、析构函数、事件、索引器、运算符) int MyField; //字段
static StaticField; //静态字段
void ShowMyField() //方法
{
Console.WriteLine(MyField);
}
static void ShowMyStaticFeld() //静态方法
{
Console.WriteLine(StaticField);
}
}

字段是隶属于类的变量,可以是任何类型,用来保存数据;

方法是具有名称的可执行代码块;


三 创建变量和类的实例


四 为数据分配内存

声明某类型变量所分配的内存是用来保存引用的,而不是用来保存类对象的实际数据。

要为实际数据分配内存,需要使用new运算符。


五 访问修饰符

在类的内部,任何函数成员都可以使用成员的名称访问类中的任意成员。

类的成员有5种访问控制:

  • 私有的private:默认访问级别,只能从声明它的内部访问,其他的类不能看见或访问。
  • 公有的public:可以被程序中的其他类访问。
  • 受保护的protected:允许派生自该类的类访问。
  • 内部的internal:对程序集内部的所有类可见,但对程序集外部的类不可见。
  • 受保护内部的protected internal:对所有派生自该类的类和所有程序集内部的类可见

六 静态字段

静态字段被类的所有实例共享,所有实例都访问同一内存位置。

即使类没有实例,也存在静态成员,并且可以访问。

var field = MyClass.StaticField;  //访问静态字段


七 静态函数成员

如同静态字段,静态函数成员独立于任何类的实例。即使没有类的实例,也可调用静态函数。

静态函数成员不能访问实例成员,但可以访问其他静态成员。

MyClass.ShowMyStaticFeld();

八 常量成员

常量成员声明在类中。

用于初始化常量成员的值在编译时必须是可计算的,且常为一个预定义简单类型或由其组成的表达式。

class MyClass
{
const int IntVal = 100;
}

九 常量和静态量

常量和静态量不同,常量没有自己的存储位置,而是在编译时被编译器替换。这种方式类似于C++中的#define。


十 属性

属性和字段不同,属性是一个函数成员:

  • 它不为数据存储分配内存;
  • 它执行代码;

属性是一组两个匹配的称为访问器的方法:

  • set访问器为属性赋值;它拥有一个单独的、隐式的值参,名称为value,与属性的类型相同;它的返回类型为void。
  • get访问器从属性获取值;它没有参数,拥有一个与属性类型相同的返回类型。

只有get访问器的属性为只读属性;只有set访问器的属性为只写属性。

属性也可以声明为static。

class MyClass
{
private int myVar; //属性访问器常使用字段作为存储;
public int MyVar
{
get { return myVar; }
set { myVar = value; }
} private int myVar1; //属性访问器中可执行计算
public int MyVar1
{
get { return myVar1 + 1; }
set { if (value > 0) myVar1 = value; }
}
} class Program
{
static void Main()
{
var myClass = new MyClass();
var p = myClass.MyVar; //隐式调用get方法
myClass.MyVar= 10; //隐式调用set方法 var myClass2 = new MyClass() { MyVar = 10, MyVar1 = 100 }; //对象初始化语句
}
}

十一 实例构造函数 constructor

实例构造函数是一个特殊的方法,它在创建类的每个实例时执行。

  • 构造函数用于初始化类实例的状态;
  • 构造函数的名称和类名相同;
  • 构造函数不能有返回值;
  • 构造函数可以带参数;
  • 构造函数可以被重载overload;
  • 如果没有显示地定义构造函数,那么编译器会定义一个隐式的默认构造函数,它没有参数,方法体为空;
  • 如果显示地定义了构造函数,那么编译器就不会定义一个隐式的默认构造函数;

十二 静态构造函数

构造函数可以声明为static,静态构造函数初始化类级别的项。

  • 初始化类级别的项,在引用任何静态成员之前,在创建类的任何实例之前;
  • 静态构造函数不能有返回值;不能带参数;
  • 类只能有一个静态构造函数,且不能带参数;
  • 静态构造函数不能有访问修饰符。

十三 析构函数 destructor

析构函数执行在类的实例被销毁之前需要的清理或释放非托管资源的行为。


十四 this关键字

this关键字在类中使用,是对当前实例的引用。


十五 readonly修饰符

字段可以用readonly修饰符修饰,作用类似于将字段声明为const,一旦值设定就不能改变。

  • const字段只能在声明时初始化;
  • readonly字段可以在声明时初始化,也可以在构造函数中初始化;
  • const的行为总是静态的,它在内存中没有存储位置
  • readonly可以是实例字段也可是静态字段,它在内存中有存储位置;

C#-3 深入理解类的更多相关文章

  1. C#图解教程 第六章 深入理解类

    深入理解类 类成员成员修饰符的顺序实例类成员静态字段从类的外部访问静态成员 静态字段示例静态成员的生存期 静态函数成员其他静态类成员类型成员常量常量与静态量属性 属性声明和访问器属性示例使用属性属性和 ...

  2. 理解类、对象、实例、原型链以及继承 - WPF特工队内部资料

    理解类.对象.实例.原型链以及继承 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  3. 谈话Java在ThreadLocal理解类

    我们必须先了解:ThreadLocal不超过一个线程类,或者它应该被称为线程局部变量.这从ThreadLocal的JDK我们可以看到的定义 public class ThreadLocal<T& ...

  4. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  5. 快速理解类的访问控制(public,protected,private)

    接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...

  6. C++ 理解类 和 类中的public、protected、private

    我们要明确,不只是C++有类,很多语言也会用到类,因为现在很多都是面向对象编程... 在c++中,关于类的理解,个人理解是这样的,具有共同属性的一个集合被称为类, 比如说人这个集合,具有性别,年龄,出 ...

  7. Effective Objective-C 2.0 — 第14条:理解“类对象“的用意

    每个实例都有一个指向Class 对象的指针,用以表明其类型,而这些 Class 对象则构成了类的继承体系. 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知. 尽量使用类型信息查询方 ...

  8. iOS 简单理解类的本质

    1.类也是个对象 类是一个对象是Class类型的对象简称类对象 Class类型的定义 // 一个任意的类型,表示一个Objective-C类 typedef struct objc_class *Cl ...

  9. python深入理解类和对象

    1,鸭子类型和多态 当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那这只鸟就是鸭子 是不是比较混乱,看个例子: # -*- coding:UTF-8 -*- __autor__ = 'zh ...

  10. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

随机推荐

  1. IP核的使用(Vivado中的调用,product guide的查询阅读 ,引脚的设置(位宽,个数,算法等),coe文件的初始化 )

    IP核:Intellectual Property core ,即知识产权核.每个IP核可以实现特定功能,我们在设计一个东西时可以直接调用某个IP核来辅助实现功能. 存在形式:HDL语言形式,网表形式 ...

  2. maven exclusion 理解

    结论:exclusion 表示对传递性依赖进行排除,排除后当前项目的依赖jar中,就不会包含该传递性依赖. 扩展:项目中的jar 都会在classpath下,排除后的传递性依赖,相当于在classpa ...

  3. [NCTF2019]Fake XML cookbook-1|XXE漏洞|XXE信息介绍

    1.打开之后显示如图所示: 2.根据题目名字就能看出来和xml有关,和xml有关的那就是注入,brup抓包看下数据包,结果如下: 3.查看post数据,确实很像xml实体注入,那就进行尝试以下,将po ...

  4. SQL及常见的三种类型注释

    SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...

  5. Docker部署kafka|Go操作实践

    前言 写作本文的背景是由于字节的暑期青训营中,某个项目要求编写一个简易的流处理引擎(flink),开发语言不限,推荐Java,本着好奇心的驱使,我打算使用Go语言进行部分尝试. 既然是流处理引擎,那么 ...

  6. BZOJ1305/Luogu3153 [CQOI2009]dance跳舞 (network flow)

    #define T 1001 #define S 0 struct Edge{ int nxt,pre,w; }e[500007]; int cntEdge,head[N]; inline void ...

  7. docker 容器terminal失败

    关键一句话:docker 容器的teminal失败,一定是等待资源导致的,不管是pid资源,还是内存资源.本文主要讲因为内存资源导致进程D状态,然后导致teminal容器失败. 目前在集群中,cpu占 ...

  8. Java数据类型扩展及面试题讲解

    这是关于数据类型的面试题,还是比较重要的. 1.整数拓展: 我们肯定都或多或少知道一个问题,叫进制问题.咱们常见的电脑里的二进制,然后咱们平时生活中用的是十进制,然后咱们工作的时候还有一个十六进制跟八 ...

  9. UE 实现镜头平移,旋转和缩放

    0x00 引 在数字孪生三维场景中,通过键盘和鼠标来控制镜头的移动,缩放是很常见的行为,也是很必要的行为,用户正是通过这些操作,达到对整个三维场景的观看和控制. 0x01 键盘控制镜头前后左右移动 通 ...

  10. BNC Part-of-speech codes

    Extracted from the BNC Manual AJ0 adjective (general or positive) e.g. good, old AJC comparative adj ...