数据类型
字符串
枚举 enum
什么是 enum
枚举是一组命名整型常量
语法
enum <enum_name>
{
enumeration list
};
其中
enum_name 指定枚举的类型名称。
enumeration list 是一个用逗号分隔的标识符列表。
枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。
using System;
namespace EnumApplication
{
class EnumProgram
{
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.ReadKey();
}
}
}
Monday: 1
Friday: 5
arry
什么是数组
一组类型相同的有序数据,它是引用类型
特点
只能存储同一种数据类型的数据;
一旦初始化,长度固定;
数组中元素与元素之间的虚拟内存地址是连续的。
语法
数组类型 [ ] 数组名 = new 数组类型 [ ] {数组元素初始化列表} ;
不足
数组的大小是固定的而且不能改变;
数组元素的类型必须一致;
元素操作不便:插入/删除元素困难;
集合
什么是集合
所有实现了 System.Collection.IEnumerable
接口的 class
的实例都是集合
特点
对比数组
集合的大小(长度)是弹性可变的;
集合中可以存放任何数据类型,元素类型是 Object
;
集合元素操作非常方便;
语法
using System;
using System.Collections;
class Test
{
public static void Main()
{
ArrayList students = new ArrayList();
Student Susan = new Student('Susan',21);
Student Tom = new Student('Tom',22);
Student Jerry = new Student('Jerry',18);
//添加元素
students.Add(Susan);
students.Add(Tom);
students.Insert(2,"Jerry");
//访问元素,需要类型转换
Student stuAnother = (Student)students[0];
//删除对象(通过索引删除)
students.Remove(0); //删除Susan
//删除对象,通过指定对象删除
students.Remove(Tom);
//Jerry,删除操作之后,剩余的元素会自动调整索引
Student last = (Student)student[0];
//遍历ArrayList
foreach(Object stu in students)
{
Student perStu = (Student)stu;
Console.WriteLine(perStu.Name);
}
for(int i = 0;i < students.Count; i++)
{
Student perStu = (Student)students[i];
Console.WriteLine(perStu.Name);
}
//ArrayList向Array转换
ArrayList.ToArray(); //转换为Object类型
ArrayList.ToArray(Type); //转换为指定的数据类型
}
}
不足
- 类型不安全:由于集合中数据类型是 Ojbect 类型,对象存储不易控制,集合访问元素的时候容易出现类型转换错误;
- 性能消耗:集合中涉及到值类型时,会遇到频繁的装箱和拆箱操作,数据在堆栈之间的转移,会对系统性能产生很大的消耗。
泛型
什么是泛型
泛型是 C#2.0 的一个新增加的特性,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。
特点
避免拆箱和装箱,提高系统性能
类型安全,使用时指定一种数据类型,确保类型安全。
多语言相互调用,可以在一种语言中定义,另一种语言中使用。
语法
using System;
using System.Collections.Generic;
class Test
{
public static void Main()
{
List<string> students = new List<string>();
//添加元素
students.Add("Susan");
students.Add("Tom");
students.Add("Jerry");
//遍历元素,不需要类型转换
foreach(string stu in students)
{
Console.WriteLine(stu);
}
for(int i = 0;i < students.Count; i++)
{
Console.WriteLine(students[i]);
}
}
}
arry list 泛型总结
开始的开始,数据通过变量来存储,当数据越来越多的时候,人们考虑用数组将类型一致的元素存储起来;当数据类型不一致,想要增加或者删除某一个元素的时候考虑用集合;集合会带来新的类型安全问题,聪明的人类又推出了泛型,代码复用,保证了类型安全还提高了性能…… 数组 → 集合 → 泛型(泛型集合),当然具体情况还是要具体分析,找到最适合的数据结构!
类型转换
隐式转换
显式转换
可空类型
实例(变量 常量)
实例定义
什么是实例化
开辟内存空间,按照数据类型(内存布局描述),向内存空间的给值的一个过程。
实例化的产物
实例:某数据类型的内存空间,存储这个数据类型的值。
实例有哪些:变量、常量、字面量、
常量
常量定义:是一种不能修改值的实例
修饰符
修饰符分类
访问控制(Access Control)
控制类、字段、属性、方法、构造函数等的可访问性范围。
-
public
同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型
-
private
只有同一类或结构中的代码可以访问该类型或成员。
-
protected
只有同一类或结构或者此类的派生类中的代码才可以访问的类型或成员。
-
internal
同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。
-
protected internal
允许跨程序集访问,但前提是两个程序集之间的类存在继承关系。
具体来说:
- 在同一程序集内,
protected internal
成员对所有类都是可访问的,不需要继承关系。 - 对于不同程序集,如果某个类要访问另一个程序集中
protected internal
修饰的成员,则必须是那个成员所在类的子类。
也就是说,
protected internal
的可访问性规则是:- 在当前程序集内部,等同于
internal
- 跨程序集访问时,要求存在继承关系,等同于
protected
这使得
protected internal
成为了一种可控的跨程序集访问方式,一方面允许不同程序集的类之间通过继承建立联系,另一方面又保证了对外部访问的一定封装性和保护。 - 在同一程序集内,
class
不同类型成员的默认访问修饰符:
属于 | 成员的默认访问修饰符 | 成员支持的修改的访问修饰符 |
---|---|---|
enum | public | 无 |
class | private | public protected internal private protected internal |
interface | public | 无 |
struct | private | public internal private |
-
继承控制(Inheritance Control)
-
abstract
将类或方法标记为必须在派生类中重写。 -
sealed
防止类被继承或方法被重写。 -
virtual
允许方法在派生类中被重写。 -
override
重写基类中的虚方法。
-
-
作用域与实例控制(Scope and Instance Control)
-
static
标记类的静态成员,属于类型本身而不是实例。 -
const
标记常量字段,其值在编译时就已确定。 -
readonly
标记只读字段,只能在构造函数中初始化。
-
-
代码组织(Code Organization)
-
partial
将类、结构或接口的定义分散在多个文件中。 -
namespace
组织类的命名空间。
-
-
特性语法(Syntax Characteristic)
-
async
标记异步方法。 -
unsafe
允许不安全代码(如指针)。
-
-
编译指令(Compiler Directive)
-
#if
、#else
、#elif
、#endif
用于条件编译。
-
通过这些修饰符,可以控制类成员的可访问性、继承行为、作用域、实例化方式,组织代码结构,启用特殊语法特性等,从而提高代码的可读性、可维护性和安全性。合理使用修饰符是编写高质量 C# 代码的重要一环。
控制继承(Inheritance Control)
- 抽象类
abstract
将类或方法标记为必须在派生类中重写。 - 私密类
sealed
防止类被继承或方法被重写。 -
virtual
允许方法在派生类中被重写。 -
override
重写基类中的虚方法。
作用域和实例控制(Scope and Instance Control)
-
static
标记类的静态成员,属于类型本身而不是实例。 -
const
标记常量字段,其值在编译时就已确定。 -
readonly
标记只读字段,只能在构造函数中初始化。
代码组织(Code Organization)
-
partial
将类、结构或接口的定义分散在多个文件中。 -
namespace
组织类的命名空间。
特性语法(Syntax Characteristic)
-
async
标记异步方法。 unsafe
允许不安全代码(如指针)。
编译指令(Compiler Directive)
#if
、#else
、#elif
、#endif
用于条件编译。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于