首页 > 编程语言 >C#的知识点1

C#的知识点1

时间:2024-06-23 13:43:11浏览次数:3  
标签:知识点 常量 C# 运算符 重载 类型 public

C#基础知识

C#的接口是什么?如何编写好的接口?

C#的接口

在C#中,接口是一种抽象类型,它定义了一组成员(方法、属性、事件等)的规范,但没有实现代码。类或结构体可以实现一个或多个接口,以表明它们提供了特定的功能。接口使得多态编程变得容易,允许通过接口引用来引用实现该接口的不同类的实例,实现运行时多态性。

C#接口声明

接口使用interface关键字来声明。接口成员的声明与类成员的声明类似,但接口成员不能有访问修饰符(public、protected、internal、private等),因为接口中的方法都需要由外面接口实现去实现方法体,那么其修饰符必然是public。接口中只能包含方法、属性、事件和索引的组合。

interface IShape
{
    void Draw();
    double GetArea();
}

C#接口的实现

类或结构体可以通过使用冒号(:)符号后跟要实现的接口列表来实现一个或多个接口。

class Circle : IShape
{
    private double radius;

    public Circle(double radius)
    {
        this.radius = radius;
    }

    public void Draw()
    {
        // 绘制圆形
    }

    public double GetArea()
    {
        return Math.PI * radius * radius;
    }
}

C#的is运算符是什么?as运算符是什么?

is 运算符和 as 运算符都是用于类型检查的运算符,但它们的行为有所不同。

C#中的 is 运算符和 as 运算符

is 运算符和 as 运算符都是用于类型检查的运算符,但它们在功能和用法上有所不同。

is 运算符

is 运算符用于检查一个对象是否兼容于指定的类型。如果兼容,则返回 true;否则,返回 false。兼容性是指该对象可以转换为指定的类型而不抛出异常。

例如,以下代码检查变量 obj 是否是 MyClass 类型或其子类:

object obj = new MyClass();

if (obj is MyClass) {
  Console.WriteLine("obj 是 MyClass 类型或其子类");
}

输出:

obj 是 MyClass 类型或其子类

is 运算符不会执行实际的类型转换,它只会检查类型兼容性。因此,它不会抛出异常。此外,如果对象引用为 null,则 is 运算符总是返回 false

as 运算符

as 运算符用于将一个对象转换为指定的类型。如果转换成功,则返回转换后的对象;否则,返回 null

例如,以下代码将变量 obj 转换为 MyClass 类型:

object obj = new MyClass();

MyClass myClass = obj as MyClass;

if (myClass != null) {
  Console.WriteLine("myClass 是 MyClass 类型");
}

输出:

myClass 是 MyClass 类型

如果 obj 不是 MyClass 类型或其子类,则 as 运算符将返回 null

as 运算符会执行实际的类型转换,因此它可能会抛出异常。例如,以下代码将字符串 "123" 转换为 int 类型:

string str = "123";

int i = str as int;

if (i != null) {
  Console.WriteLine("i 的值是:" + i);
}

输出:

i 的值是:123

如果 str 不是有效的数字字符串,则 as 运算符将抛出 FormatException 异常。

总结

以下是 is 运算符和 as 运算符的总结:

运算符 功能 用法 返回值
is 检查类型兼容性 obj is MyType truefalse
as 转换类型 obj as MyType 转换后的对象或 null

一般来说,建议使用 is 运算符来检查类型兼容性,使用 as 运算符来执行实际的类型转换。

C#的Object类

Object 类是 C# 中所有类型(包括值类型和引用类型)的基类。这意味着所有类型都从 Object 类派生,并继承了它的成员。

Object 类定义了一些基本的方法和属性,这些方法和属性对于所有类型都是通用的。例如:

  • Equals 方法:用于比较两个对象的相等性。
  • ToString 方法:用于将对象转换为字符串表示形式。
  • GetHashCode 方法:用于获取对象的哈希码。
  • GetType 方法:用于获取对象的类型信息。

此外,Object 类还定义了一些静态方法,例如 ReferenceEquals 方法,用于比较两个对象的引用是否相等。

Object类的作用

Object 类在 C# 中扮演着重要的角色,它具有以下作用:

  • 提供了所有类型之间共享的基础功能。
  • 使得不同类型的对象之间能够进行交互。
  • 支持类型转换和类型检查。

Object类的常见用法

Object 类在 C# 中的常见用法包括:

  • 将对象存储在集合中。
  • 将对象作为参数传递给方法。
  • 从基类向上转型对象。

C#中readonly和const区别

C# 中的 readonlyconst 区别

readonlyconst 都是 C# 中用于声明常量的关键字,但它们在功能和用法上有所不同。

const 关键字

const 关键字用于声明编译时常量。编译时常量是指在编译期间就已经确定值且不能更改的常量。

const 常量必须在声明时初始化,并且只能使用字面量或其他编译时常量作为初始化值。例如,以下代码声明了一个名为 PI 的编译时常量,其值为圆周率:

const double PI = 3.14159265358979323846;

编译时常量具有以下特点:

  • 值在编译期间就已经确定,不能在运行时更改。
  • 具有较高的性能,因为编译器可以直接将常量值替换到代码中。
  • 可以用于定义枚举成员。

readonly 关键字

readonly 关键字用于声明运行时常量。运行时常量是指在运行时才能确定值且不能更改的常量。

readonly 常量可以在声明时初始化,也可以在构造函数中初始化。例如,以下代码声明了一个名为 MAX_SIZE 的运行时常量,其值在构造函数中初始化:

class MyClass {
  public readonly int MAX_SIZE;

  public MyClass() {
    MAX_SIZE = 100;
  }
}

运行时常量具有以下特点:

  • 值在运行时才能确定,因此可能会受到运行环境的影响。
  • 性能略低于编译时常量,因为编译器需要在运行时获取常量值。
  • 不能用于定义枚举成员。

总结

以下是 constreadonly 的总结:

特性 const readonly
常量类型 编译时常量 运行时常量
初始化时机 声明时 声明时或构造函数中
值来源 字面量或其他编译时常量 任意表达式
性能 较高 较低
用途 定义数学常量、枚举成员 定义配置参数、常量表达式

C#中如何运算符重载

运算符重载(Operator overloading)是 C# 中一项重要的功能,它允许程序员为自定义类型定义新的运算符。这意味着您可以让您的自定义类型像内置类型一样使用运算符,例如 +-*/ 等。

运算符重载的基本规则

运算符重载必须遵循以下基本规则:

  • 只能重载静态运算符,不能重载实例运算符。
  • 运算符重载方法必须使用 publicstatic 修饰符。
  • 运算符重载方法的返回类型必须与重载的运算符的返回类型兼容。
  • 运算符重载方法的参数个数必须与重载的运算符的参数个数一致。

运算符重载的语法

以下是运算符重载的语法:

public static return_type operator operator_symbol(parameters)
{
  // 方法体
}

其中:

  • return_type 是运算符重载方法的返回类型。
  • operator_symbol 是要重载的运算符符号。
  • parameters 是运算符重载方法的参数列表。

例如,以下代码重载了加法运算符 +,用于两个 Complex 类型的对象:

class Complex {
  public double Real { get; set; }
  public double Imaginary { get; set; }

  public Complex(double real, double imaginary) {
    Real = real;
    Imaginary = imaginary;
  }

  public static Complex operator +(Complex c1, Complex c2) {
    return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
  }
}

在这个例子中,operator + 方法重载了加法运算符 +,用于两个 Complex 类型的对象。该方法的返回类型是 Complex,参数列表中包含两个 Complex 类型的参数。

运算符重载的注意事项

在重载运算符时,需要注意以下事项:

  • 运算符重载应该保持语义一致性。这意味着重载的运算符应该与内置运算符具有相同的语义。例如,如果重载了加法运算符 +,则应该使 a + b 等价于 b + a
  • 运算符重载应该考虑性能。重载的运算符应该尽可能高效,避免不必要的性能开销。
  • 运算符重载应该谨慎使用。过度使用运算符重载可能会使代码变得难以理解和维护。

运算符重载的示例

以下是一些运算符重载的示例:

  • 重载加法运算符 +,用于两个 Complex 类型的对象:
class Complex {
  // ...
  public static Complex operator +(Complex c1, Complex c2) {
    // ...
  }
}
  • 重载减法运算符 -,用于两个 Point 类型的对象:
class Point {
  public int X { get; set; }
  public int Y { get; set; }

  public static Point operator -(Point p1, Point p2) {
    return new Point(p1.X - p2.X, p1.Y - p2.Y);
  }
}

C#中的ref和out参数

refout都是C#中用于传递参数引用的关键字,但它们在用法和功能上有所不同。

ref参数

ref参数用于按引用传递参数。这意味着在方法中对ref参数的任何更改都将反映在调用者的原始变量中。

例如,以下代码将一个整数变量 x 传递给 Swap 方法:

int x = 10;
int y = 20;

Swap(ref x, ref y);

Console.WriteLine("x = " + x); // 输出:x = 20
Console.WriteLine("y = " + y); // 输出:y = 10

Swap 方法使用ref参数来交换 xy 的值。在方法内部,xy 的值实际上是同一个内存地址,因此对其中一个变量的更改都会影响另一个变量。

ref参数必须在传递之前初始化。如果ref参数未初始化,则会导致编译错误。

out参数

out参数也用于按引用传递参数,但与ref参数不同的是,out参数在传递之前不需要初始化。此外,out参数必须在方法返回之前赋值

例如,以下代码将一个字符串变量 name 传递给 GetFullName 方法:

string name = "";

GetFullName(out name, out string surname);

Console.WriteLine("name = " + name); // 输出:name = John
Console.WriteLine("surname = " + surname); // 输出:surname = Doe

GetFullName 方法使用out参数来获取一个人的姓名和姓氏。在方法内部,namesurname 的值最初为空,但方法会在返回之前将这两个变量赋值为实际的姓名和姓氏。

out参数通常用于从方法返回多个值的情况。例如,以下代码使用out参数来返回一个矩形的面积和周长:

int width = 5;
int height = 3;

int area;
int perimeter;

GetRectangleAreaAndPerimeter(width, height, out area, out perimeter);

Console.WriteLine("Area = " + area); // 输出:Area = 15
Console.WriteLine("Perimeter = " + perimeter); // 输出:Perimeter = 16

GetRectangleAreaAndPerimeter 方法使用out参数来返回矩形的面积和周长。在方法内部,areaperimeter 的值最初为空,但方法会在返回之前将这两个变量赋值为实际的面积和周长。

总结

以下是ref和out参数的总结:

特性 ref out
初始化 必须在传递之前初始化 不需要初始化
赋值 可以不赋值 必须在返回之前赋值
用途 双向传递参数值 从方法返回多个值

标签:知识点,常量,C#,运算符,重载,类型,public
From: https://www.cnblogs.com/AndreaDO/p/18263348

相关文章

  • Apache Spark 安装和基础使用
    Spark概述ApacheSpark是一个开源的集群计算框架,以其快速、易用、通用和高度可扩展性而著称。Spark支持多种编程语言,包括Java、Scala、Python和R,并提供了丰富的库,如SparkSQL、MLlib、GraphX和SparkStreaming。Spark的主要特点快速:Spark通过在内存中存储中间数据,......
  • 数据结构(C语言版)-第一章绪论
    1.1什么是数据结构数据结构是计算机科学中一个核心概念,它涉及到如何在计算机中有效地存储、组织和管理数据。数据结构的选择和设计直接影响到算法的效率和程序的性能。其基本要素包括数据元素(也称为节点或记录)、数据元素之间的关系,以及在此基础上定义的各种操作。具体来......
  • Android 14.0 Launcher3仿ios长按app图标实现拖拽抖动动画
    1.概述在14.0的系统rom定制化开发中,在对系统原生Launcher3的定制需求中,也有好多功能定制的,在ios等电子产品中的一些好用的功能,也是可以被拿来借用的,所以在最近的产品开发需求中,需求要求模仿ios的功能实现长按app图标实现抖动动画,接下来看如何分析该功能的实现.效果图如图:......
  • python---OpenCv(二),背景分离方法较有意思
    目录边界矩形旋转矩形(最小外接矩形):计算轮廓找4个点的坐标把浮点型转为Int画轮廓边界矩形--(最大外接矩形)转灰度找轮廓找顶点画矩形显示背景分离方法(这个很好玩,可以识别在动的物体)边界矩形有两种类型的边界矩形:旋转矩形(最小外接矩形):是用最小面积绘制......
  • VS coed常用插件(补充)
    接续上文:VSCode常用插件整理-CSDN博客插件1.IntelliSenseforCSSclassnamesinHTML自动感知<style>中已定义的css选择器,同时支持检测外联样式,在给html标签添加已定义样式时,十分好用;个人感觉比HTMLCSSSupport好用一点2.CSSClassIntellisense自动感知HTML结构中......
  • VS Code常用插件整理
    目录1.Chinese(Simplified)(简体中文)          VScoed汉化2.IntelliCode                                          智能补全代码3.IntelliCodeAPIUsageExamples        智能代码API使用示例4.jQuer......
  • AcWing算法基础课笔记——求组合数3
    求组合数Ⅲ20万组数据,1≤b≤a≤1......
  • LeetCode 448. 找到所有数组中消失的数字(哈希表)
    448.找到所有数组中消失的数字思路:方法一,借助额外的0(n)空间sta进行哈希classSolution{public:vector<int>findDisappearedNumbers(vector<int>&nums){intn=nums.size();vector<int>sta(n,0);for(inti=0;i<n;i++){......
  • [本科项目实训] Anaconda 环境迁移
    问题描述由于本地显卡GeForceRTX4070Ti推理速度较慢,我们拟采用服务器GeForceRTX3090进行最后的项目展示,因而需要重新配置环境。由于Cuda版本和Conda版本基本一致,拟采用condapack指令进行快速迁移。解决方案第一步,在base环境下载condapack:pipinstallconda-pack第......
  • [本科项目实训] HuggingFace简介与Git lfs模型下载
    HuggingFace[1]HuggingFace是一个人工智能领域尤其是自然语言处理领域的开源平台,包含数据集、模型、文档、解决方案等内容的分享。由于LLM的参数量较大,往往将参数文件托管到该平台并使用transformers[3]库进行模型调用。模型下载由于项目要求模型本地运行,因而需要下载模......