目录
一.运算符
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("车辆移动");
}
}