当前位置: 首页 > news >正文

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

目录

一.运算符

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.MinValueConsole.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); // 输出: JohnConsole.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); // 输出: MikeConsole.WriteLine(person1.FirstName); // 输出: John(原对象未变)}   
}

9.接口

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

代码示例:

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


http://www.mrgr.cn/news/83574.html

相关文章:

  • Nginx反向代理请求头有下划线_导致丢失问题处理
  • hdfs与mapreduce
  • PatchTST:通道独立的、切片的 时序 Transformer
  • 计算机网络之---公钥基础设施(PKI)
  • 反转链表的javascript写法
  • 微信小程序开发设置支持scss文件
  • C# 虚方法和抽象方法的区别,重写和重载的区别,参数修饰符(ref、out、in、params)--09
  • [Unity]MacOS下开发Unity
  • 计算机组成原理(1)
  • 英语语法精简框架
  • stable diffusion 量化学习笔记
  • Go语言之路————go环境的初始化
  • MySQL表的增删改查(基础)-下篇
  • uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机上
  • Redis高频知识点
  • 项目实战--网页五子棋(用户模块)(1)
  • wow-agent 学习笔记
  • 记一次sealos部署k8s集群之delete了第一台master如何恢复
  • LeetCode热题100-合并两个有序链表【JavaScript讲解】
  • 学习华为熵减,激发组织活力
  • LangChain 学习笔记 1 简介
  • Open FPV VTX开源之默认MAVLink设置
  • C#中的Array数组,List集合和ArrayList集合--07
  • Springboot——钉钉(站内)实现登录第三方应用
  • Day04-后端Web基础——Maven基础
  • Vue2+OpenLayers接入天地图API实现搜索定位和点击获取经纬度及地址功能(提供Gitee源码)