C#中的运算符和类--06

news2025/1/13 11:04:38

目录

一.运算符

1.赋值运算符

2.算数运算符

3.关系运算符

4.逻辑运算符

5.位运算符

6.三元运算符

7.空合并运算符

8.其他运算符

二.类

1.普通类

2.静态类

3.抽象类

4.密封类

5.部分类

6.泛型类

7.嵌套类

8.记录类

9.接口


一.运算符

1.赋值运算符

定义:赋值运算符用于将右侧表达式的值赋值给左侧

  • =:简单赋值,例如x=5;
  • +=:加并赋值,例如x+=3;相当于x=x+3;
  • -=:减并赋值,例如x-=2;相当于x=x-2;
  • *=:乘并赋值,例如x*=4;相当于x=x*4;
  • /=:除并赋值,例如x/=5;相当于x=x/5;
  • %=:取模并赋值例如x%=6;相当于x=x%6;

2.算数运算符

定义:用于执行基本的算数运算

  • +:加法,例如a+b
  • -:减法,例如a-b
  • *:乘法,例如a*b
  • /:除法,例如a/b
  • %:取模,例如a%b,返回a除以b的余数
  • ++:自增,例如a++,将a的值增加1
  • --:自减,例如a--,将ad值减少1

前后缀自增自减的区别

前缀自增:

先执行+1操作再使用变量的新值

代码示例:

 int a = 5;
 int b = ++a; // a 的值变为 6,b 的值为 6

后缀自增:

先使用变量的当前值,再执行自增操作

代码示例:

 int a = 5;
 int b = a++; // b 的值为 5,在对b执行完赋值操作后,a执行自增操作,a 的值变为 6

3.关系运算符

  • ==:等于,例如a==b
  • !=:不等于,例如a!=b
  • >:大于,例如a>b
  • <:小于,例如a<b
  • >=:大于等于,例如a>=b
  • <=:小于等于,例如a<=b

注意: 关系运算符的返回结果是一个布尔值(true或者false)

4.逻辑运算符

  • &&:逻辑与,例如a&&b
  • ||:逻辑或,例如a||b
  • !:逻辑非,例如!a

注意:逻辑运算符和关系运算符一样,返回结果是一个布尔值

5.位运算符

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

运算法描述示例
&如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。(A & B) 将得到 12,即为 0000 1100
|如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。(A | B) 将得到 61,即为 0011 1101
^如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。(A ^ B) 将得到 49,即为 0011 0001
~按位取反运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0,包括符号位。(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<<二进制左移运算符。左操作数的值向左移动右操作数指定的位数。A << 2 将得到 240,即为 1111 0000
>>二进制右移运算符。左操作数的值向右移动右操作数指定的位数。A >> 2 将得到 15,即为 0000 1111

6.三元运算符

定义:三元运算符也叫做条件运算符

写法: 条件表达式?X:Y   如果条件为真则为X否则为Y

代码示例:

int number = 5;
string result = number > 3 ? "Number大于 3" : "Number小于或等于 3";
Console.WriteLine(result);

7.空合并运算符

定义:??称之为空合并运算符,它的作用是当左侧表达式不为null时,返回左侧表达式的值,否则返回右侧表达式的值。

代码示例:

string? str1 = null;
string str2 = "默认值";
string resultStr = str1 ?? str2;
Console.WriteLine($"字符串结果: {resultStr}");  // 输出: 默认值

如果??左右都为空值,那么结果也将会是空值

代码示例:

string? str1 = null;
string? str2 = null;
string? result = str1 ?? str2;

Console.WriteLine(result); // 输出: (空字符串,因为result是null)

??运算符可以多次嵌套,如果多次嵌套,每次先判断前面两个,如果其中一个非空,则输出结果.如果前面两个都为空,则将前两个当做一个空值,继续向下判断.

代码示例:

string? str1 = null;
string? str2 = null;
string defaultStr = "默认值";
string result = str1 ?? str2 ?? defaultStr;

Console.WriteLine(result); // 输出: 默认值

8.其他运算符

  • ,:逗号运算符,用于分隔多个表达式,通常在 for 循环中使用,例如for(int i=0,j=0;i<10;i++,j++)
  • sizeof:返回类型的大小,例如sizeof(int)
  • typeof:返回类型的Type对象,例如typeof(int)
  • is:检查对象是否为某类型的实例,例如obj is string
  • as:尝试将对象转换为某种类型,例如 obj as string
  • new:创建对象实例,例如new Class()
  • delegate:用于声明委托类型
  • checked和unchecked:用于控制整型算数运算和转换的溢出检查

checked:用于显示启用溢出检查.如果运算结果超出目标类型的运算范围,将引发OverflowException异常

代码示例:

try   
{
    int maxInt = int.MaxValue;
    checked
    {
        int result = maxInt + 1; // 这将引发 OverflowException
    }   
}   
catch (OverflowException)   
{
    Console.WriteLine("范围溢出");
}

unchecked:关键字用于显式禁用溢出检查,即使结果超出范围也不会引发异常,溢出后结果会被截断。

代码示例:

int maxInt = int.MaxValue;   
int result = unchecked(maxInt + 1); // 不会引发异常,结果为 int.MinValue
   
Console.WriteLine(result); // 输出:-2147483648   

二.类

在C#中,类的类型可以根据其特性和用途进行分类。

1.普通类

普通类是最基本的类类型,用于定义对象的结构和行为

代码示例:

public class Car   
{
//定义属性
    public string Make { get; set; }
    public string Model { get; set; }
//定义方法
    public void Drive()
    {
        Console.WriteLine("醉酒不能开车");
    }   
}

2.静态类

静态类不能够被实例化,其内的所有成员必须是静态的.用于提供与特定对象无关的功能.

代码示例:

public static class MathUtilities   
{
//在静态类下定义的方法必须使用static进行修饰
    public static double Add(double a, double b)
    {
        return a + b;
    }
}

3.抽象类

抽象类不能被实例化,通常包含抽象方法。用于定义一组基本行为,由派生类实现。

代码示例:

public abstract class Animal   
{
    public abstract void MakeSound();

    public void Sleep()
    {
        Console.WriteLine("Sleeping");
    }   
}
   
public class Dog : Animal   
{
    public override void MakeSound()
    {
        Console.WriteLine("Woof");
    }
}

4.密封类

密封类不能被继承,用于防止类被进一步扩展。

代码示例:

//密封类使用sealed 关键字进行修饰
public sealed class Configuration   
{
    public void Load()
    {
        Console.WriteLine("Loading configuration");
    }
}

5.部分类

部分类允许将一个类的定义分散在多个文件中。

代码示例:

// File1.cs   
public partial class Person   
{
    public string FirstName { get; set; }   
}
   
// File2.cs   
public partial class Person
{
    public string LastName { get; set; }
}   

6.泛型类

泛型类允许在类定义中使用类型参数,以提高代码的复用性和类型安全性。

代码示例:

public class Box<T>   
{
    private T _value;

    public void SetValue(T value)
    {
        _value = value;
    }

    public T GetValue()
    {
        return _value;
    }    
}    

7.嵌套类

嵌套类是定义在另一个类内部的类,通常用于封装仅在外部类中使用的辅助功能。

代码示例:

public class OuterClass    
{
    public class NestedClass
    {
        public void Display()
        {
            Console.WriteLine("嵌套的方法");
        }
        }        
}        

8.记录类

记录类是C# 9.0引入的一种类型,专注于不可变数据模型,提供内置的值相等性比较。

常量关键字(const)能够更好地帮助我们去理解记录类

用途:

const用于定义常量值,这些值在编译时就被确定,并且在程序运行时不能改变。通常用于定义不可变的常量,如数学常数、固定配置值等。

特性:

  • 编译时常量:const的值在编译时就被计算机存储,不能够在运行时去进行改变
  • 只能用于值类型:const只能用于内置的值类型(int,double等)和比较特殊的引用类型(string)不能够去用于一般的引用类型
  • 静态:const字段隐式为静态的,因此不能够通过实例去访问

记录类的主要特点是 :

  • 不可变性:记录类的对象通常是只读的,确保对象一旦创建后,其状态不会改变
  • 值相等性:记录类默认提供值相等性比较,即两个记录类对象具有相同的值时被认为是相等的
  • 简洁语法:记录类可以使用简洁的语法定义,并自动生成构造函数 Equals,GetHashCode和ToString方法

记录类可以使用record关键字定义

代码示例:

// 定义记录类   
public record Person(string FirstName, string LastName);
   
class Program   
{
    static void Main()
    {
        // 创建记录类对象
        Person person1 = new Person("John", "Doe");
        Person person2 = new Person("Jane", "Doe");

        // 使用记录类对象
        Console.WriteLine(person1.FirstName); // 输出: John
        Console.WriteLine(person2.LastName);  // 输出: Doe

        // 比较记录类对象
        Person person3 = new Person("John", "Doe");
        Console.WriteLine(person1 == person3); // 输出: True(值相等性比较)

        // 记录类的不可变性
        // person1.FirstName = "Mike"; // 编译错误:记录类属性是只读的

        // 使用 with 表达式创建新对象
        Person person4 = person1 with { FirstName = "Mike" };
        Console.WriteLine(person4.FirstName); // 输出: Mike
        Console.WriteLine(person1.FirstName); // 输出: John(原对象未变)
    }   
}

9.接口

虽然接口不是类,但它定义了一组必须由实现类提供的成员。用于实现多重继承。

代码示例:

public interface IMovable
{
    void Move();
}

public class Vehicle : IMovable
{
    public void Move()
    {
        Console.WriteLine("车辆移动");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络 (34)可靠传输的工作原理

前言 计算机网络可靠传输的工作原理主要依赖于一系列协议和机制&#xff0c;以确保数据在传输过程中能够准确无误地到达目的地。 一、基本概念 可靠传输指的是数据链路层的发送端发送什么&#xff0c;在接收端就收到什么&#xff0c;即保证数据的完整性、正确性和顺序性。由于网…

基于ADAS 与关键点特征金字塔网络融合的3D LiDAR目标检测原理与算法实现

一、概述 3D LiDAR目标检测是一种在三维空间中识别和定位感兴趣目标的技术。在自动驾驶系统和先进的空间分析中&#xff0c;目标检测方法的不断演进至关重要。3D LiDAR目标检测作为一种变革性的技术&#xff0c;在环境感知方面提供了前所未有的准确性和深度信息. 在这里&…

Vue3初学之常用的指令

v-bind&#xff1a;动态绑定属性 v-bind 用于动态绑定一个或多个属性&#xff0c;或一个组件 prop 到表达式的值。 v-model&#xff1a;双向数据绑定 见上篇 https://editor.csdn.net/md/?articleId145022994 v-if、v-else-if、v-else&#xff1a;条件渲染 v-show&…

docker中jenkins流水线式部署GitLab中springboot项目

本质就是将java项目拉取下来&#xff0c;并自动打包成docker镜像&#xff0c;运行 首先启动一个docker的jenkins 如果没有镜像使用我的镜像 通过网盘分享的文件&#xff1a;jenkins.tar 链接: https://pan.baidu.com/s/1VJOMf6RSIQbvW_V1zFD7eQ?pwd6666 提取码: 6666 放入服…

在ubuntu下对NFS做性能测试

安装NFS 首先&#xff0c;安装服务 sudo apt update sudo apt install nfs-kernel-server然后创建共享文件夹 # 请自定义你自己的共享目录 sudo mkdir -p /exports/nfs4/homes sudo chmod -R 777 /exports/nfs4/homes# 这个可以根据no_root_squash标致选择设置。 # 如果不设…

Open FPV VTX开源之默认MAVLink设置

Open FPV VTX开源之默认MAVLink设置 1. 源由2. 准备3. 连接4. 安装5. 配置6. 测试6.1 启动wfb-ng服务6.2 启动wfb-ng监测6.3 启动QGroundControl6.4 观察测试结果 7. 总结8. 参考资料9. 补充9.1 telemetry_tx异常9.2 DEBUG串口部分乱码9.3 PixelPilot软件问题 1. 源由 飞控图传…

26个开源Agent开发框架调研总结(2)

根据Markets & Markets的预测&#xff0c;到2030年&#xff0c;AI Agent的市场规模将从2024年的50亿美元激增至470亿美元&#xff0c;年均复合增长率为44.8%。 Gartner预计到2028年&#xff0c;至少15%的日常工作决策将由AI Agent自主完成&#xff0c;AI Agent在企业应用中…

mark 一下conductor github

Netflix 关闭conductor 后&#xff0c;后续https://orkes.io/content/ 继续在维护&#xff0c;github地址如下 https://github.com/conductor-oss/conductor 最新release为3.21.11

PyCharm文档管理

背景&#xff1a;使用PyCharmgit做文档管理 需求&#xff1a;需要PyCharm自动识别docx/xslx/vsdx等文件类型&#xff0c;并在PyCharm内点击文档时唤起系统内关联应用(如word、excel、visio) 设置步骤&#xff1a; 1、file -》 settings -》file types 2、在Files opened i…

嘉立创画原理图和PCB

一、环境 进入立创EDA官网 注册登录的环节就不介绍了。 登录账号后&#xff0c;选择专业版 二、原理图 工程中&#xff0c;有原理图和PCB&#xff0c;这里选择原理图 那么接下来就是进行绘制 元器件在如下区域搜索使用。 双击进行放置&#xff0c;也可以左键提前预览。 网…

科创驱动 | 华望系统科技荣膺西湖区年度前沿创新新锐企业

2025年1月3日&#xff0c;由中共西湖区党委、西湖区人民政府主办的“新年第一会”—西湖区科技创新大会在杭州隆重举行。大会现场揭晓了西湖区年度科技创新团队与项目&#xff0c;并发布了“2024西湖区科技十大事件”与“西湖区五大年度科技榜单”。杭州华望系统科技有限公司榜…

Monorepo设置:新手指南

Monorepo是一种项目代码管理方法&#xff0c;指在单个代码仓库中管理多个项目&#xff0c;有助于简化代码共享、版本控制、构建和部署的复杂性&#xff0c;并提供更好的可重用性和协作性。 简单理解&#xff1a;所有项目都在一个代码仓库中 &#x1f4e6;&#xff0c;但这并不意…

[Python学习日记-75] 计算机基础与网络

[Python学习日记-75] 计算机基础与网络 简介 计算机基础 什么是网络编程 计算机网络 简介 本篇主要介绍的计算机基础是浓缩的&#xff0c;这是因为我们主要学习的是 Python&#xff0c;而 Python 主要是为了开发应用程序的&#xff0c;并不会用它来开发操作系统和嵌入式程序…

1. Doris分布式环境搭建

一. 环境准备 本次测试集群采用3台机器hadoop1、hadoop2、hadoop3, Frontend和Backend部署在同一台机器上&#xff0c;Frontend部署3台组成高可用&#xff0c;Backend部署3个节点&#xff0c;组成3副本存储。 主机IP操作系统FrontendBackendhadoop1192.168.47.128Centos7Foll…

【Java】-- 利用 jar 命令将配置文件添加到 jar 中

目录 1、准备 2、目标 3、步骤 3.1、安装 jdk 3.2、添加配置文件 3.3、校验 1、准备 java 环境hadoop-core-1.2.1.jar 和 core-site.xml 2、目标 将 core-site.xml 添加到 hadoop-core-1.2.1.jar 中。 3、步骤 3.1、安装 jdk 3.2、添加配置文件 jar -cvf hadoop-core-…

day14-Linux系统基础权限知识精讲

1. 给文件加特殊属性 1.1 chattr a:只能追加内容&#xff0c;不能删除 i:不能修改&#xff0c;不能删除;保护关键文件&#xff0c;防止非法写入 [rootoldboy ~]# chattr a test.txt [rootoldboy ~]# chattr i test.txt [rootoldboy ~]# echo 123 >> test.txt -bash: t…

Android使用系统消息与定时器实现霓虹灯效果

演示效果: 界面设计: 在帧布局FrameLayout中添加6个TextView 依次设置这6个TextView的宽&#xff0c;高&#xff0c;权重 也可在XML中直接设置 添加自定义颜色 关联自定义颜色到数组变量 关联6个TextView控件到数组变量 处理自定义系统消息 Handler _sysHandler new Han…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路&#xff1a; 一、项目背景 二、功能分析 查询功能流程图&#xff1a; 管理功能流程图&#xff1a; 三、设计 四、实现 代码实现&#xff1a; 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树&#xff08;打印&#xff09; 建立右兄弟…

vue3+elementPlus之后台管理系统(从0到1)(day1)

vue3官方文档&#xff1a;https://cn.vuejs.org/guide/introduction.html 1、项目创建 确保电脑已安装node 查看命令&#xff1a; node -v进入项目目录&#xff0c;创建项目 npm init vuelatest Need to install the following packages: create-vue3.13.0 Ok to procee…

汉图科技XP356DNL高速激光打印一体机综合性能测评

汉图科技XP356DNL高速激光打印一体机效率方面表现出色&#xff0c;支持A4纸型的高速打印&#xff0c;单面打印速度高达35页/分钟&#xff0c;自动双面打印速度可达32面/分钟&#xff0c;这样的速度在日常办公中能够极大地提高打印效率&#xff0c;减少等待时间&#xff0c;满足…