C# - 问答
C# 是由微软开发的一种现代、通用、面向对象的编程语言。 C# 专为公共语言基础架构 (CLI) 而设计,它由可执行代码和运行时环境组成,允许在不同的计算机平台和架构上使用各种高级语言。
交错数组是数组的数组。
您可以将交错数组初始化为 -
int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};
其中,scores 是一个包含两个整数数组的数组 - scores[0] 是一个包含 3 个整数的数组,scores[1] 是一个包含 4 个整数的数组。
有三种方式可以将参数传递给方法 -
值参数 - 此方法将参数的实际值复制到函数的形式参数中。在这种情况下,在函数内部对参数的更改不会影响参数本身。
引用参数 - 此方法将对参数内存位置的引用复制到形式参数中。这意味着对参数所做的更改会影响参数。
输出参数 − 此方法有助于返回多个值。
可以!使用输出参数。return 语句只能返回一个值。但是,使用输出参数可以返回两个值。
输出参数类似于引用参数,不同之处在于它们将数据传输出方法而不是传入方法。引用参数将对参数内存位置的引用复制到形式参数中。这意味着对形式参数的更改会影响参数本身。
命名空间旨在提供一种方法来区分不同名称集。在一个命名空间中声明的类名不会与在另一个命名空间中声明的相同类名冲突。
using 关键字用于在程序中包含命名空间。一个程序通常包含多个 using 语句。
值类型变量可以直接赋值。它们派生自 System.ValueType 类。
值类型直接包含数据。例如,int、char 和 float,分别存储数字、字母和浮点数。声明 int 类型时,系统会分配内存来存储该值。
引用类型不包含变量中存储的实际数据,但包含对变量的引用。
换句话说,它们指向一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果其中一个变量更改了该内存位置的数据,另一个变量的值也会自动反映更改。内置引用类型的示例包括:对象、动态和字符串。
对象类型是 C# 通用类型系统 (CTS) 中所有数据类型的最终基类。 Object 是 System.Object 类的别名。对象类型可以赋值给任何其他类型、值类型、引用类型、预定义类型或用户定义类型的值。但是,赋值之前需要进行类型转换。
将值类型转换为对象类型时,称为装箱。
将对象类型转换为值类型时,称为拆箱。
您可以在动态数据类型变量中存储任何类型的值。这些变量的类型检查在运行时进行。
声明动态类型的语法为:-
dynamic <variable_name> = value;
例如:
dynamic d = 20;
动态类型与对象类型类似,不同之处在于对象类型变量的类型检查在编译时进行,而动态类型变量的类型检查在运行时进行。
指针类型变量存储其他类型的内存地址。C# 中的指针具有与 C 或 C++ 中的指针相同的功能。
声明指针类型的语法为:-
type* identifier;
例如
char* cptr; int* iptr;
is 运算符用于判断对象是否属于特定类型。
If( Ford is Car) // 检查 Ford 是否是 Car 类的对象。
as 运算符进行强制类型转换,如果转换失败则不会引发异常。
Object obj = new StringReader("Hello"); StringReader r = obj as StringReader;
封装的定义是"将一个或多个项目封装在物理或逻辑包装中的过程"。在面向对象编程方法中,封装可以阻止访问实现细节。
封装是通过使用访问说明符来实现的。
访问说明符定义类成员的作用域和可见性。
公共访问说明符允许类将其成员变量和成员函数暴露给其他函数和对象。任何公共成员都可以从类外部访问。
私有访问说明符允许类向其他函数和对象隐藏其成员变量和成员函数。只有同一类的函数才能访问其私有成员。即使是类的实例也无法访问其私有成员。
受保护访问说明符允许子类访问其基类的成员变量和成员函数。这样有助于实现继承。
Internal 访问说明符允许类将其成员变量和成员函数暴露给当前程序集中的其他函数和对象。换句话说,任何带有 internal 访问说明符的成员都可以从定义该成员的应用程序中的任何类或方法访问。
受保护的内部访问说明符允许类将其成员变量和成员函数隐藏,使其不受同一应用程序中其他类对象和函数(子类除外)的影响。这也适用于实现继承。
C# 提供了一种特殊的数据类型,即可空类型,您可以为其分配正常范围的值以及空值。
例如,您可以在 Nullable
空值合并运算符用于可空值类型和引用类型。它用于将一个操作数转换为另一个可空(或不可空)值类型操作数的类型,此时可以进行隐式转换。
如果第一个操作数的值为空,则该运算符返回第二个操作数的值,否则返回第一个操作数的值。
通过使用 params 关键字,可以指定一个方法参数,该参数接受可变数量的参数,甚至不接受任何参数。
不可以!在方法声明中,params 关键字后不允许添加其他参数。方法声明中只能使用一个 params 关键字。
Array 类是 C# 中所有数组的基类。它定义在 System 命名空间中。Array 类提供了各种用于处理数组的属性和方法。
使用 Array.sort(array) 函数。它使用数组中每个元素的 IComparable 实现对整个一维数组中的元素进行排序。
首先使用 Array.sort(array) 对数组进行排序,然后使用 Array.reverse(array) 方法对其进行反向排序。
在 C# 中,结构体是一种值类型数据类型。它可以帮助您使单个变量保存各种数据类型的相关数据。struct 关键字用于创建结构体。
结构体用于表示一条记录。要定义结构体,必须使用 struct 语句。 struct 语句为您的程序定义了一种新的数据类型,其中包含多个成员。
类和结构体有以下基本区别 -
类是引用类型,而结构体是值类型。
结构体不支持继承。
结构体不能有默认构造函数。
枚举是一组命名的整型常量。枚举类型使用 enum 关键字声明。
C# 枚举是值数据类型。换句话说,枚举包含其自身的值,并且不能继承或传递继承。
类类型的默认访问说明符是 internal。
成员的默认访问权限是 private。
继承是面向对象编程中最重要的概念之一。继承允许我们根据另一个类来定义一个类,这使得创建和维护应用程序变得更加容易。这也提供了重用代码功能并加快实现时间的机会。
创建类时,程序员不必编写全新的数据成员和成员函数,而是可以指定新类继承现有类的成员。这个现有类称为基类,新类称为派生类。
继承的概念实现了"是-是"关系。例如,哺乳动物是动物,狗是哺乳动物,因此狗也是动物,等等。
不支持! C# 不支持多重继承。
一个类可以从多个类或接口派生,这意味着它可以从多个基类或接口继承数据和函数。 在 C# 中创建派生类的语法如下:
<acess-specifier> class <base_class> { ... } class <derived_class> : <base_class> { ... }
多态性意味着具有多种形式。在面向对象编程范式中,多态性通常表示为"一个接口,多个函数"。
多态性可以是静态的或动态的。在静态多态性中,对函数的响应在编译时确定。在动态多态性中,响应在运行时确定。
C# 提供了两种实现静态多态性的技术。它们是:-
函数重载
运算符重载
在编译时将函数链接到对象的机制称为早期绑定。它也被称为静态绑定。
在同一作用域内,可以对同一个函数名进行多个定义。每个函数的定义必须在参数列表的类型和/或参数数量上有所不同。不能重载仅返回类型不同的函数声明。
动态多态性由抽象类和虚函数实现。
当一个类被声明为密封时,它不能被继承。
不!无法创建,因为抽象类不能被声明为密封的。
当您在类中定义了一个函数,并希望在继承类中实现它时,可以使用虚函数。这些虚函数在不同的继承类中可能以不同的方式实现,并且这些函数的调用将在运行时决定。
您可以重新定义或重载 C# 中大多数内置运算符。因此,程序员也可以使用用户定义类型的运算符。
重载运算符是具有特殊名称的函数,名称由关键字"operator"加上所定义运算符的符号组成。与其他函数类似,重载运算符具有返回类型和参数列表。
接口被定义为一种语法契约,所有继承该接口的类都应遵循该契约。接口定义了语法契约的"什么"部分,而派生类定义了语法契约的"如何"部分。
接口定义属性、方法和事件,它们是接口的成员。接口仅包含成员的声明。定义成员是派生类的责任。它通常有助于提供派生类应遵循的标准结构。
预处理器指令指示编译器在实际编译开始之前预处理信息。
所有预处理器指令都以 # 开头,并且一行中预处理器指令前只能出现空格字符。预处理器指令不是语句,因此它们不以分号 (;) 结尾。
您可以使用 #if 指令创建条件指令。条件指令可用于测试一个或多个符号,以检查它们的计算结果是否为真。如果结果为 true,编译器将执行 #if 和下一个指令之间的所有代码。
C# 异常由类表示。C# 中的异常类主要直接或间接地从 System.Exception 类派生而来。从 System.Exception 类派生的一些异常类是 System.ApplicationException 和 System.SystemException 类。
System.ApplicationException 类支持由应用程序生成的异常。因此,程序员定义的异常应该从此类派生。
System.SystemException 类是所有预定义系统异常的基类。