1.转换成其他类型
1. parse() 适用于string转成其他类型
string strNumber = "123"; int intNumber4= int.Parse(strNumber)
2. int.TryParse 和parse()比较类似,
含义:他不会产生异常行为 转成功返回true,如果转失败返回false 最后一个参数为输出值,如果转失败,输出值为0
int ab; //用于输出参数
string stringNumber6 = "a12";
bool isSuccess = int.TryParse(stringNumber6, out ab);
string isSuccessStr = isSuccess?"转换成功":"转换失败";
Console.WriteLine(isSuccessStr);
3. convert类型转换 合适各种类型相互转换
万能类型转换 任意类型之间转换,但是转换的内容要符合转换符合转换后类型的标准
4.ToString() 适合其他类型转换成字符串.
2.算数运算符
++先进行自增运算再赋值 --先进行自减运算再赋值
1.关系运算符
2.逻辑运算符
3.位运算符
1. &按位与运算 只要其中一个为0 结果0 反之为1
2 .|只要其中一个为1 结果1反之为0
3.^按位异运算符 两个位置上相同 结果为0 反之为1
4.~按位取反运算符 取不同位置的反向 0方向1 1方向0
5.<<左移运算符 A = 0011 1100
6. 右移运算符
4.赋值运算符
+=让变量自增加任意的数值
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
5. for 循环() 和do....while和whlie循环
1. for多次执行一个语句序列,简化管理变量的代码
2.do....while除了它是个循环主体结尾测试条件外 其他于whil语句类似
3.whlie循环 当给条件为真时,重复语句或语句组,它会在执行循环主体前侧试条
break 关键字 用于循环体中 终止当前循环体
continue 关键字 用于循环体中 终止当次循环 进入下一次循环
goto语句 跳转语句 LOGIN; 标签
6. swich语句判断
1.switch()中的变量可以是整形、string、bool、char、枚举或相应可以为null的类型,
2.每个case标签后是常量表达式(定值)的值
3.break语句的作用是在case与case之间中断程序。
4.default标签可选,意思是其余的结果。 类似与else
7. 访问修饰符
1.public 所有对象可以访问
2.internal 同一个程序集对象可以访问
3.private 对象本身在对象内部可以访问
4.protected 只有该类对象及其子类对象可以访问
5. protected internal 访问限于当前程序集或派生自包含类的类型。
6.private protected:该类型或成员可以通过从class派生的类型访问
8.方法(函数)
1.调用方法 分为静态调用和非静态调用
(1)静态调用 调用其他类的共有方法 必须要标识类的名字
ClassTest.ClassTestMothod9();
(2)非静态调用 调用其他类的共有非静态方法,必须要使用其他类对象的名字
ClassTest classTest = new ClassTest();
(3)在本类中非静态方法中调用 非静态方法 使用this调用 也可以省略
this.ClassTestMothod5();
区别 1. 静态方法调用使用 类名.静态方法
2. 非静态方法调用使用 类的对象.非静态方法
2.定义方法:1.访问修饰符 2. 静态或非静态 3.返回类型 3.方法名称 4.参数列表
(1)访问修饰符 这个决定了变量或方法对于另一个类的可见性。
(2) 静态或非静态 staitc的方法是静态方法 反之是非静态方法
(3)返回类型 一个方法可以返回一个值 返回类型是方法返回的值数据类型,如果方法不返回如何值,则返回类型为void
(4)方法名称:是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其他标识符相同
(5)参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。参数是可选的,也就是说,一个方法可能不包含参数。
9返回类型分类
1. 无返回值类型 和返回值类型
无返回值类型用void 相反有返回值用int string都可以
return 在方法中使用 跳出方法 也可以当方法的出口
retrun的结果 要和返回值类型保持一致
9.参数传递
区别:参数分为形参 和 实际参数
含义:形参的个数是无限个 形参的类型 可以是任意类型 和返回值类型一致
2.引用参数
1. 参数关键字 ref
特点1.引用参数是一个变量的内存位置的引用 不会创建一个新的内存位置
2. 参数关键字 out
特点2 输出参数传递 让方法有多个返回值的结果的参数
10.空类型null
含义:表示不引用任何对象的空引用,没有创建内存空间,存放的是空引用指针
类型:Null类型是System.Nullable<T>这个struct的类型
?单号使用场景:当我们想要对于一个值类型变量进行 判断 是否 存在时,为了节约内存 可以赋值为null
(2)??双问号
作用 用于判断一个变量在为null的时候返回一个指定的值
使用场景:合并运算符为类型转换定义了一个预设值,以防可空类型的值为 Null
11.数组
(1).不可变的数组
特点.数组属于引用类型 数组只能包含类型相同的元素 数组通过下标(索引值)标记元素
格式,datatype[] arrayName;
datatype 用于指定被存储在数组中的元素的类型。
指定数组的秩(维度)。秩指定数组的大小。
arrayName 指定数组的名称
数据类型[] 数组名 = new 数据类型[长度可忽略]{值 1,值 2,…}
遍历数组方式:for foreach
(2).初始化二维数组
含义:数组嵌套数组形式 一般常用二维数组
二位数组格式:string [,] strArray =new string[数组个数,数组元素个数]
遍历:studentArray.GetLength(0)
(3).交错数组
含义:交错数组是数组的数组,交错数组是一维数组。
12.Array 类 e瑞
含义:是C#中所有数组的基类,它是在System命名空间中定义 提供了各种用于数组的属性和方法
格式 :CreateInstance静态方法 用于创建一维数组
参数1:设置数组数据类型 typeof(int)转化值类型 为Type类型对象
参数2 数组的长度
添加元素: intArray.SetValue(100, 0); 参数1 object添加的元素 参数2 数组的索引值 三档u
获取一维数组指定位置元素 int a = (int) intArray.GetValue(0); ov
查找数组元素的索引值 如果存在 返回对应索引值 反之返回 -1 Array.IndexOf(intArray3, 100);
从大到小排序: Array.Sort(intArray3);
13.可变参数params 盆润死
1.params是ParamArrayAttribute(参数数组属性)的缩写
2.params解决lC#中不定参数的传递的问题
3.params参数必须定义在参数列表最后面
4.params必须对一维数组描述
5.params只能在一个方法中 定义一个一维数组
14.字符串
string 引用类型
字符串常用的APl方法
1.Length 获取字符串的长度,即字符串字符的个数
2.indexof 返回整数,得到指定的字符串在字符串中第一次出现的位置
3.LastlndexOf返回整数,得到指定的字符串在原字符串中最后一次出现的位置.
4.StartsWith 返回布尔型的值,判断某个字符串是否指定的字符串开头。四道死为死
5.EndsWith 返回布尔型的值,判断某个字符串是否以指定的字符串结尾 安斯为死
6.ToLower 返回一个新的字符串,将字符串中的大写字母换成小写字母 头偶为死
7.ToUpper 返回一个新的字符串,将字符串中的小写字母转换成大写字母
8.Trim 返回一个新的字符串,不带如何参数时表示将原字符串中前后的空格删除
9.Remove 返回一个新的字符串,将字符串中指定位置的字符串移除
10.Trim Start 返回一个新的字符串,将字符串中左侧的空格删除
11. TrimEnd 返回一个新的字符串,将字符串中右侧的空格删除
12.PadLeft 返回一个新的字符串,从字符串的左侧填充空格达到指定的字符串长度.
13.PadRight 返回一个新的字符串,从字符串的右侧填充空格达到指定的字符串长度.
14.Substring 返回一个新的字符串,用于截取指定的字符串.
15.Insert 返回一个新的字符串,将一个字符串插入到另一个字符串中指定索引的位置.
15.格式化字符串方式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ZhiYouDay11_4
{
internal class Program
{
static void Main(string[] args)
{
//格式化字符串方式
//方式1 +拼接
string str1 = "abc";
string str2 ="hjk";
Console.WriteLine(str1+str2);
//占位符 {变量索引值}
string str3 = "abc";
int intNumber = 100;
Console.WriteLine("{0}{1}",str3,intNumber);
Console.WriteLine("{0}{0}",str3,intNumber);
//数组越界
// Console.WriteLine("{0}{2}", str3,intNumber);
Console.WriteLine("这是"+"{0}"+"这是"+"{1}",str3,intNumber);
Console.WriteLine("这是{0}这是{1}",str3,intNumber);
//
int i = 12345;
Console.WriteLine("{0:C}", i); //货币
Console.WriteLine("{0:D}", i); //十进制数
Console.WriteLine("{0:E}", i); //科学技术法
Console.WriteLine("{0:F}", i); // 浮点数表示法
Console.WriteLine("{0:G}", i); //G或g General 常用格式
Console.WriteLine("{0:N}", i); //N或n 用逗号分割千位的数字
//获得当前时间
DateTime dateTime = DateTime.Now;
Console.WriteLine(dateTime.ToString());
Console.WriteLine("{0:D}", DateTime.Now); //输出到天
Console.WriteLine("{0:y}", DateTime.Now); //输出到月
Console.WriteLine("{0:m}", DateTime.Now); //取出是那个月
Console.WriteLine("{0:T}", DateTime.Now); // 取长时间到秒
Console.WriteLine("{0:t}", DateTime.Now); //取短时间到分
Console.WriteLine("{0:tt}", DateTime.Now); //取出是上午还是下午
//format
string abcStr = string.Format("abc");
string abcStr1 = string.Format("{0}{1}{2}", 'a', 'b', 'c');
//模板字符串 $"{变量1},{变量2}"
string str4 = "abc";
int intNumber5 = 100;
float floatNumber5 = 200.0f;
Console.WriteLine($"{str4}{intNumber5}{floatNumber5}");
Console.ReadKey();
}
}
}
16.类和对象
定义一个类
1类要定义在命名空间中或者可以定义在类中嵌套
2.格式 访问修饰符 class 类名 {类的作用域 包含内容,类的成员}
访问修饰符 默认是internal 可以使用public 在类嵌套可以使用private
类名 大驼峰命名方式 其他参考 标识符用法
类的成员 成员变量(字段)成员函数 (属性和方法)
3.特征(属性和字段)
1.字段
(1) 在类中字段也可以叫全局变量
(2)字段在定义在类中方法之外的 局部变量是定义在方法内部的
(3)字段的格式 访问修饰符 数据类型 字段名
(4)字段是由默认值的 值类型默认值为0 引用类型默认值为null 局部变量没有默认值5)
(5)在一个类中 不能重复定义字段
(6)字段包含 静态字段和非静态字段(实例字段)
(7)实例字段 随着new对象的创建而创建
(8)静态字段 在类加载的时候创建 且创建一次
常量const 只能在初始化时 赋值 const包含staitc
readonly 可以在初始化时和构造函数中赋值 readonly 不包含staitc
17.属性
1.属性 是类 ,结构 和接口的命名成员
2.属性其实外界访问私有字段的入口 属性本质是方法,一个属性可以分别有一个set和get方法组成(或者称为访问器)
3.属性就是对字段的封装,set给某个字段写数据,get读取某个字段数据
4.属性的格式
public int code
{
get
{
return code;
}
set
{
code=value;
}
}
18.构造函数和析构函数
(1构造函数分为实例构造函数,私有构造函数和静态构造函数
(2他主要用于对象分配内存空间,对数据成员进行初始化
(3类默认自带构造函数 如果需要扩展内容 也可以重新定义构造函数
(4实例构造构造函数的名字必须与类同名
(5实例构造函数没有返回类型,他可以带参数,也可以不带参数
2.1 静态类
静态类中的所有成员为静态 方法 属性 字段 都要创建静态的
3.1 静态构造函数
(1 静态构造函数即没有访问修饰符,也没有参数
(2 创建第一个类实例或如何静态成员被引用是 自动调用静态构造函数来初始化
(3 在类创建时 系统自动调用一次静态构造函数
4.1析构函数
1.垃圾回收程序最终销毁对象之前调用的方法,该方法称为析构函数
2.析构函数,没有返回值 且不带如何参数
3.在对象删除前,用它来做一些清理工作 比如一些和类相关的属性
析构函数 写法前面加~MyClass
4.强制开启回收 立即回收内存 调用结构函数 GC.Collect();
18.封装
(1 将类的某些信息隐藏在类内部(private),不允许外部程序直接访问,
(2 而是通过该类提供的公共属性(public)来实现对隐藏信息的操作和访问
19.继承
(1 一个类继承另一个类 其中被继承的类(父类 超类 基类) 继承的类(子类 派生类)
(2 继承关系建立后 子类拥有父类的属性和方法 反之父类不继承子类属性和方法。
(3 继承的作用:解决类与类直接 属性或者方法重复的问题
(4 C#中类与类之间是单继承关系 利用接口实现多继承(后续讲)
(5 .继承的格式 A类(子类) : B类(父类)
(6 创建子类对象时,系统默认先调用父类构造方法,然后再调用子类构造方法
(7 当父类有有参构造方法时,如果子类有构造方法(无参或有参),
要求父类必须有一个无参构造方法。
(8 .转型:子类可以赋值给父类,但是父类不能赋值给子类
(9 .覆盖:在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被 隐藏,编译后会提示要求使用New关键字
(10.Object 是所有引用类型的基类
20 Object
如果类没有明确的继承关系 默认继承object类
object是所有类的基类
1.多态
含义:即一个接口 多个功能,同一种操作作用于不同的对象,可以有不同的解释,不产生不同的执行结果体现多态的功能 重写 重载 抽象类 接口
(1 覆盖
(1覆盖 在子类中一个和基类一样名字(参数不同也不算) 的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字
分类允许子类覆盖叫重写 virtual允许子类覆盖 这种方法叫虚方法
子类重写父类的方法 使用override
(2 重载
函数名相同,参数类型或者顺序不同构成重载,与返回类型无关
(3重写
必然发生在基类和派生类中,其类函数用virtual修饰符,派生类用override修饰
public void Test2()
{
//base关键字 代表父类的对象
// base.Test2();
//代表当前类的对象
// this.Test2();
Console.WriteLine("Test4");
}
21抽象类
1.关键字 abstract
2.不能被实例化 不能创建对象
3.抽象类可以包含抽象方法,或者普通方法
4.抽象方法属性只能被定义,在子类中实现
5.继承抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实现
6.通过包含使用 override 修饰符的属性声明,可在派生类中重写抽象类 方法和属性
public abstract class MyClass {
//普通方法
public void Eat() {
Console.WriteLine("吃饱了");
}
//普通的属性
public int Age { get; set; }
//抽象方法
public abstract void Drink();
//抽象属性
public abstract int Bge { get; set; }
}
public class MyClass1:MyClass{
//实现抽象类drink方法
public override void Drink() {
Console.WriteLine("实现抽象类 Drink方法");
}
private int _bge;
//实现抽象类Bge属性
public override int Bge { get { return _bge; } set { _bge = value; } }
}
22.接口
作用:用接口可以使程序更加清晰和条理化
1. 接口使用 Interface 关键字声明 它与类的声明类似,接口声明默认是public
2.接口只能包含了成员的声明(方法 属性声明)
3.不允许声明成员的修饰符,即使是Public都不行,因为接口成员总是共有的
4.不能声明为虚拟和静态的成员
5.接口中定义的成员 需要类继承 类进行实现 类的继承关系 要在接口继承之前
6.接口也可以继承接口
7.一个类 可以继承多个接口(接口就是C#现实对各继承的方式)
(1 接口和抽象类的区别和相同点
相同点 不能实例对象 都可以被继承 都可以给继承提供成员模板
不同点 接口只能有成员定义 不能定义静态和虚拟的成员 抽象类 也可以包含成员的实现
接口可以实现多继承 抽象类只能单继
interface IMyinterface
{
int Age { get; set; }
void IMyinterfaceMothod();
}
//public class MyClass :IMyinterface
public class MyClass :Object ,IMyinterface {
public int Age { get; set; }
public void IMyinterfaceMothod() {
Console.WriteLine("123");
}
}
// 接口继承接口 可以继承多个接口
interface IMyInterFace2:IMyInterFace1,IMyInterFace3
{
}
23.密封类
1.密封类可以用来限制继承性
2.声明密封类使需要使用sealed关键字
3.密封类和普通类一样 都可以定义属性和方法
4.密封类不能作为基类被继承,但它可以继承别的类或接口
5.密封类可以实例化对象,系统中String 就是密封类
6.在密封类中不能声明保护成员或虚成员
public sealed class SealedClass:Class1,IMyIterFace
{
private int _age;
public int Age { get { return _age; } set { _age = value; } }
public SealedClass() {
}
public void SealedClassMothod() {
}
}
24.泛型
作用: 允许我们延迟编写类或方法中的数据类型,直到真正使用时确定类型的一种规范
1.可以创建自己的泛型接口,泛型类 泛型方法、泛型集合 ,泛型事件和泛型委托
2.泛型的格式 结构<泛型名称T> 在定义泛型时T通常用作变量类型名称。但实际上 T 可以用任何有效名称代替
3.泛型的方法在定义时提供泛型的类型,在调用方法时 提供具体的延迟编写的类型
4.泛型无法直接使用运算符
比如 + - < > 等 但是能使用Object中的属性和方法
//普通类型
//public void MyClassMothod(int a) {
// Console.WriteLine(a);
//}
//泛型方法的定义
public void MyClassMothod<T>(T a)
{
Console.WriteLine(a);
}
public T MyClassMothod1<T>(T a, T b)
{
Console.WriteLine(a);
Console.WriteLine(b);
return a;
}
1. 泛型方法格式
通过dynamic 将类型校验推迟到运行时
2.继承泛型类
两种继承1.将父类进行特化,然后继承
2. 无法在class 子类声明的时候决定父类的泛型类型
24.1泛型类
解决泛型的默认值问题 D a = default(D);
//普通类继承泛型类
public class MyClass3:MyClass2<int ,string> {
}
//泛型类继承泛型类
public class MyClass4<T>:MyClass2<string,int> {
public T Name { get; set; }
}