提示:以下是本篇文章正文内容
–
abstract | decimal | finally | in | partial | short | typeof | volatile |
可以和类、方法、属性、索引器及事件一起使用,标识一个可以扩展但不能被实体化的、必须被实现的类或方法。 | ~ | 定义一个代码块,在程序控制离开try代码块后执行。参见try和catch。 | ~ | ~ | ~ | 一个操作符,返回传入参数的类型。 | 标识一个可被操作系统、某些硬件设备或并发线程修改的attribute。 |
as | default | fixed | int | out | set | uint | where |
一个转换操作符,如果转换失败,就返回null。 | ~ | 在一个代码块执行时,在固定内存位置为一个变量指派一个指针。 | ~ | 标识一个参数值会受影响的参数,但在传入方法时,该参数无需先初始化。 | ~ | ~ | ~ |
base | delegate | float | interface | namespace | stackalloc | unchecked | while |
用于访问被派生类或构造中的同名成员隐藏的基类成员。 | 指定一个声明为一种委托类型。委托把方法封装为可调用实体,能在委托实体中调用。 | ~ | 将一个声明指定为接口类型,即实现类或构造必须遵循的合同。 | 定义一个逻辑组的类型和命名空间。 | 返回在堆上分配的一个内存块的指针。 | 禁止溢出检查。 | ~ |
bool | continue | for | internal | override | sizeof | ulong | yield |
true/false | ~ | ~ | 一个访问修饰符。 | ~ | 一个操作符,以byte为单位返回一个值类型的长度。 | ~ | ~ |
break | double | foreach | is | private | static | unsafe | class |
终止循环语句 | ~ | 用于遍历一个群集的元素。 | ~ | ~ | ~ | 标注包含指针操作的代码块、方法或类。 | ~ |
byte | do | get | lock | ref | this | void | true |
范围是0~255 | ~ | ~ | ~ | 标识一个参数值可能会受影响的参数。 | ~ | ~ | ~ |
case | else | goto | long | readonly | struct | ushort | extern |
~ | ~ | 一个跳转语句,将程序执行重定向到一个标签语句。 | ~ | 标识一个变量的值在初始化后不可修改。 | 是一种值类型,可以声明常量、字段、方法、property、索引器、操作符、构造器和内嵌类型。 | ~ | 标识一个将在外部(通常不是c#语言)实现的方法。 |
catch | enum | if | new | public | throw | using | false |
定义一个代码块,在特定类型异常抛出时,执行块内代码。 | 表示一个已命名常量群集的值类型。 | ~ | ~ | ~ | 抛出一个异常。 | 当用于命名空间时,using关键字允许访问该命名空间中的类型,而无需指定其全名。也用于定义finalization操作的范围。 | ~ |
char | event | implicit | null | return | try | value | sbyte |
~ | 允许一个类或对象提供通知的成员,他必须是委托类型。 | 一个操作符,定义一个用户定义的转换操作符,通常用来将预定义类型转换为用户定义类型或反向操作,隐式转换操作符必须在转换时使用。 | ~ | ~ | 异常处理代码块的组成部分之一。try代码块包括可能会,抛出异常的代码。参阅catch和finally关键字。 | ~ | ~ |
checked | explicit | const | object | protected | switch | virtual | sealed [18] |
既是操作符又是语句,确保编译器运行时,检查整数类型操作或转换时出现的溢出。 | 一个定义用户自定义转换操作符的操作符,通常用来将内建类型转换为用户定义类型或反向操作,必须再转换时调用显示转换操作符。 | 标识一个可在编译时计算出来的变量值,即一经指派不可修改的值。 | ~ | ~ | ~ | 一个方法修饰符,标识可被覆载的方法。 | 防止类型被派生,防止方法和property被覆载。 |
Hello world !
打开VS->新键项目->找到控制台程序(.NET Framework)->下一步->创建
e g eg eg :
–
🔔如何编译当前程序?
🔔如何运行当前程序?
e g eg eg:
🔔注释
1.在目前学习代码阶段,保证你写的每行代码都要配一行注释
2.解释说明,你这句代码是什么含义
☆ 快捷键:
注释当前选中行的代码:Ctrl + K + C
取消注释当前选中行的代码:Ctrl + K + U
MSDN官方 :https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.fieldinfo?view=netframework-4.7.2
(面试经常问)
☆ 浮点数(通常理解就是生活中的小数)
天文数字可能会用到这个
☆ 变量:在程序运行期间,可以被改变
☆ 变量可以不赋初值(在特殊情况下必须要赋初值)
☆ 常量:在程序运行期间,不能被改变
但极为不推荐
☆ 常量及变量的命名规范
大驼峰(每个单词的首字母大写,其余字母小写)
1、MyHeroDamage、HeroAttack
小驼峰:(第一个单词首字母不大写,后面每个单词的首字母大写,其余字母小写)
2、myHeroDamage、heroAttack【目前阶段都用小驼峰】
–
☆ 赋值运算符 “=”,是一个运算,将后面的结果赋给前面的变量或常量
//int showYouAge = age++;
//意味着 age++ 得到的结果是 age
//解析:
//第一步:将age的值赋给showYouAge
//第二步:age自增
int showYouAge = ++age;
//意味着 ++age 得到的结果是 age+1
//解析:
//第一步:age自增
//第二步:将age的值赋给showYouAge
//总结:
//age++;++age;
//++符号在前就先自增,后赋值
//++符号在后就先赋值,后自增
练习题 ↓
输出
输入
从屏幕读取一串字符,并返回该字符串
字符串是一个数据类型
1、关键词
S
t
r
i
n
g
String
String
2、表示一串字符
3、用双引号括起来
4、字符串相加可以得到两个字符串组合到一起的字符串
作用:代码 分成一个区域,方便折叠和展开
区域首部:#region
区域尾部:#endregion
e g eg eg:
1、将占用字节小的、取值范围小的、精度小的,转换为占用字节大的、取值范围大的、精度高 → 向上转原则
2、不需要任何的修饰符,会自动转换
//整型
//1 2 4 8
//sbyte short int long
sbyte englishScore = 100;
//sbyte --> int
int myScore = englishScore;
//int --> long
long classScore = myScore;
//int --> float
float newScore = myScore;
//float --> double
double newClassScore = newScore;
☆ 显式转换(强制转换)
//强制转换
int damage = 10000;
//int --> sbyte
sbyte health = (sbyte)damage;
//输出结果
Console.WriteLine(health); //16
float mathScore = 90.5f;
//float --> int
int myAllScore = (int)mathScore;
//会把小数点后面的内容全部舍去
Console.WriteLine(myAllScore); //90
//int 和 char之间的类型转换
int num = 11101;
//int --> char
char letter = (char)num;
//a-97
Console.WriteLine(letter);
评论区请教大神!!!
int和bool之间的类型转换
string与其他类型之间的转换
string 转换方法
☆ 逻辑运算符:逻辑运算是bool与bool之间的运算 ↓
1、true & true : true
2、true & false : false
3、false & false : false
4、总结:一假则假
1、true | true : true
2、true | false : true
3、false | false : false
4、总结:一真则真
1、! true : false
2、! false : true
1、普通的&与运算,无论第一个条件是真是假,都会继续判断第二条件
2、短路与运算&&,如果判断第一个条件已经是假,则不会继续判断第二个条件
1、普通的|与运算,无论第一个条件是真是假,都会继续判断第二条件
2、短路或运算||,如果判断第一个条件已经是真,则不会继续判断第二个条件
1、优点:第一个条件已经得知整个逻辑运算的结果,就不会去判断第二个条件了 → 节约了运算量
2、缺点:如果判断中带有运算,如果不进行第二个条件的判断,那第二个条件中的运算也不能执行
–
☆ 手动计算下列表达式的值和number的值,并编写程序来验证结果是否正确
int a = 50;
int b;
b = a > 500 ? a : b; //返回 50
if(条件表达式){
语句1;
}
if (条件表达式)
{
语句1;
}
else
{
语句2;
}
if (条件表达式1)
{
语句1;
}
else if (条件表达式2)
{
语句2;
}
else
{
语句3;
}
☆ Switch
浮点型是有误差的
浮点型一般不做等于的判断
代码演示
using System;
namespace MyApplication
{
class Program
{
static void Main(string[] args)
{
int day = 4;
switch (day)
{
case 1:
Console.WriteLine("Monday");
break;
case 2:
Console.WriteLine("Tuesday");
break;
case 3:
Console.WriteLine("Wednesday");
break;
case 4:
Console.WriteLine("Thursday");
break;
case 5:
Console.WriteLine("Friday");
break;
case 6:
Console.WriteLine("Saturday");
break;
case 7:
Console.WriteLine("Sunday");
break;
}
}
}
}
while (条件表达式)
{
//循环内容
}
☆ break关键词
☆ continue关键词
–
☆ 从键盘输入算数运算式,使用if语句实现正确的算数运算,并输出运算结果。
例如:
☆ 输入一个生日日期,输出其星座
例如:
☆ 动态初始化
一、数据类型[] 数组名=new 数据类型[数组长度];
二、数据类型[] 数组名=new 数据类型[数组长度]{元素1,元素2…};
三、数据类型[] 数组名=new 数据类型[]{元素1,元素2…};
从0开始计数
array.Length是数组的长度,只读的。
访问数组时,切记下标所对应的数组元素是存在的
☆ 数据类型
int、float、bool、char
☆ 引用类型(存储在堆内存)
int[] array = {1,8,4,8,7,45,456,789,78,76};
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(i + ":" + array[i]);
}
–
思想
效果演示 G i f Gif Gif :
e g eg eg :
for (int i = 0; i < array.Length; i++)
{
//立个flag,表示判断过程中是否发生了交换
bool IsjiaoHuan= false;
for (int j = 0; j < array.Length - i - 1; j++)
{
if (array[j] > array[j + 1])
{
//说明交换了
IsjiaoHuan= true;
//交换
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
if(!IsjiaoHuan)
{
//说明已经排好序了,后面的轮次就没有必要了
break;
}
for (int m = 0; m < array.Length; m++)
{
Console.Write(array[m] + "\t");
}
Console.WriteLine();
}
Console.WriteLine("排序结束");
for (int m = 0; m < array.Length; m++)
{
Console.Write(array[m] + "\t");
}
e g eg eg 图示
–
👂int[,] array;
☆ 动态初始化
👂int[,] arr= new int[50,3];
👂int[,] arr= new int[,]{{1,0,1},{3,0,5}};
☆ 静态初始化
👂int[,] arr= {{1,0,1},{3,0,5}};
☆ 二维数组的元素访问
👂 arr[3,2]
☆ 谨防数组越界
for (int i = 0; i < heroData.GetLength(0); i++)
{
for (int j = 0; j < heroData.GetLength(1); j++)
{
Console.Write(heroData[i,j] + "\t");
}
//换行
Console.WriteLine();
}
//foreach性能消耗要大一点,所以能用for的尽量用for
foreach (var item in number)
{
Console.WriteLine(item);
//迭代遍历是只读的,不能写入
//item = 1;
}
–
//装备类型
enum EquipType
{
Helmet = 100,//头盔
BodyArmor = 200,//防弹衣
Knapsack,//背包
Knife
}
//定义一个枚举类型的变量
EquipType myEquip = EquipType.Knapsack;
EquipType yourEquip = EquipType.Knapsack;
//判断枚举变量
if(myEquip == EquipType.BodyArmor) { }
switch (myEquip)
{
case EquipType.BodyArmor:
break;
case EquipType.Helmet:
break;
case EquipType.Knife:
break;
//case EquipType.
default:
break;
}
//枚举类型和整型之间的转换
//枚举类型可以强制转换为整型
int num = (int)myEquip;
Console.WriteLine(num);
//整型可以强制转换为枚举类型
myEquip = (EquipType)200;
Console.WriteLine(myEquip);
//既然枚举可以用整数去表示
Console.WriteLine(myEquip+2);
//学生类型
struct Student
{
public string name;
public char sex;
public int age;
}
//定义一个学生变量
Student xiaoming;
//学生结构内变量赋值
xiaoming.name = "xiaoming";
xiaoming.age = 16;
xiaoming.sex = 'M';
public Student()
{
}
//自定义构造函数
public Student(string n,char s,int a)
{
//作用:快速给结构体字段赋初值
//而且必须给每一个字段都赋初值
name = n;
sex = s;
age = a;
}
//有了自定义的构造函数后,如何新建结构体变量
Student xiaogang = new Student("xiaogang",'M',18);
e g eg eg:
#region 结构体、枚举
//创建英雄装备结构体,包含名称,攻击力加成,法术强度加成,血量加成,装备类型
enum EquipType
{
AD,
AP,
HP,
Other
}
//英雄装备
struct HeroEquip
{
public string name;
public float adAddition;
public float apAddition;
public float hpAddition;
public EquipType equipType;
public HeroEquip(string name, float adBuff, float apBuff, float hpBuff, EquipType equipType)
{
//给所有字段赋初值
this.name = name;
adAddition = adBuff;
apAddition = apBuff;
hpAddition = hpBuff;
this.equipType = equipType;
}
}
#endregion
#region 结构体、枚举练习
//有5个装备保存在结构体数组当中,编程找出血量加成最高者
//对装备数组按照攻击力加成排序并使装备按照攻击力加成升序进行信息打印
HeroEquip wjzr = new HeroEquip(
"无尽之刃", 100, 0, 50, EquipType.AD);
HeroEquip yxj = new HeroEquip(
"饮血剑", 80, 0, 20, EquipType.AD);
HeroEquip ktkj = new HeroEquip(
"狂徒铠甲", 0, 0, 150, EquipType.AD);
HeroEquip dmj = new HeroEquip(
"兰德里的折磨", 20, 100, 0, EquipType.AD);
//声明结构体数组存储这些装备
HeroEquip[] heroEquips = { wjzr, yxj, ktkj, dmj };
//设置初始血量最大值
float maxHPBuff = heroEquips[0].hpAddition;
//设置初始血量最大值的装备名称
string maxHPEquipName = heroEquips[0].name;
HeroEquip maxHPEquip = heroEquips[0];
//找血量最大
for (int i = 0; i<heroEquips.Length; i++)
{
if (maxHPBuff<heroEquips[i].hpAddition)
{
//更新最大值
maxHPBuff = heroEquips[i].hpAddition;
//更新最大值的装备名称
maxHPEquipName = heroEquips[i].name;
}
//如果声明结构体
if (maxHPEquip.hpAddition<heroEquips[i].hpAddition)
{
maxHPEquip = heroEquips[i];
}
}
Console.WriteLine("装备列表中,血量加成最高的装备是\n"
+ maxHPEquip.name + ",最大值是"
+ maxHPEquip.hpAddition);
Console.Read();
#endregion
图示 ↓
[访问修饰符] Class 类名//大驼峰命名法
类名 对象名;
类名 对象名 = new 类名();
图示 ↓
–
帮助注释也是一种注释
谁可以添加帮助注释 ↓
图示 ↓
–
–
Random random = new Random();
int num = random.Next(0,array.Length);
–
☆ 方法
☆ 如果要完成一件大事
[访问修饰符] 返回值类型 方法名(参数列表)
{
//方法体
//实现方法功能
return 结果;//最终别忘了返回方法结果,结果类型需与返回值类型保持一致
}
对象名.方法名(参数列表);//无论有无参数,小括号都要存在
图示 ↓
不要写读取该属性的语句
不要写写入该属性的语句
图示 ↓
☆ 添加了ref关键词的参数
–
☆ 所以ref一般加在值类型参数的前面
☆ 使用应用参数,无论是形参还是实参前面都要加ref关键词
图示 ↓
–
–
S
T
R
I
N
G
STRING
STRING
Contains | Contains |
---|---|
Remove | LastIndexOf |
public string Remove(( int startIndex)/ (int startIndex, int count )) | public int LastIndexOf( (string/char) value ) |
CopyTo | PadLeft |
从 string 对象的指定位置开始复制指定数量的字符到 Unicode 字符数组中的指定位置。 | 补充左边长度:.PadLeft(2, ‘0’) |
Format | PadRight |
把指定字符串中一个或多个格式项替换为指定对象的字符串表示形式。 | 补充右边长度:.PadRight(2, ‘0’) |
IndexOf | Replace |
返回指定 Unicode 字符在当前字符串中第一次出现的索引,索引从 0 开始。 | 替换文字:stringObj.replace(“终古”,“中国”); |
Insert | Split |
返回一个新的字符串,其中,指定的字符串被插入在当前 string 对象的指定索引位置。 | 返回一个字符串数组,包含当前的 string 对象中的子字符串,子字符串是使用指定的 Unicode 字符数组中的元素进行分隔的。 |
Join | ToLower |
连接一个字符串数组中的所有元素,使用指定的分隔符分隔每个元素。 | 把字符串转换为小写并返回。 |
Substring | ToUpper |
string substr = str.Substring(23); | 把字符串转换为大写并返回。 |
Trim | |
移除当前 String 对象中的所有前导空白字符和后置空白字符。 |
using System.Text;
System.Text.StringBuilder strB = new System.Text.StringBuilder();
StringBuilder stringB = new StringBuilder();
//追加字符串
stringBuilder.Append("天气好晴朗");
class Funs
{
public string Fun(string a, string b)
{
return "a+b";
}
public int Fun(int a, int b)
{
return a + b;
}
}
Funs funs = new Funs();
int a = funs.Fun(1, 1);
string b = funs.Fun("2", "2");
string c = string.Format("{0},{1}", a, b);
Console.WriteLine(c);
Console.Read();
图示 ↓
int A = 60;
int a = 0;
recursion();
function recursion(){
if(A>a){
a++;
Console.WriteLine(a);
recursion();
}
}
自动
写一个空参数空方法体的构造函数不会帮你自动创建
代码演示 当前构造函数(…) : this(传实参)
class Person
{
private int age;
private string name;
public Person(int age)
{
this.age = age;
Console.WriteLine(age);
}
public Person(string name) : this(18)
{
this.name = name;
Console.WriteLine(name);
}
public Person(int age, string name) : this("xian")
{
Console.WriteLine("我是性别,年龄!");
}
}
static void Main(string[] args)
{
Person body = new Person(128, "alll");
Console.Read();
}
必会
调用父类的构造函数如果父类是空参数的构造函数 : base()
可以不写:base()
系统会默认调用父类的空参数构造
如果父类是有参数的构造函数,那么一定概要通过:base的方式调用,传参
public class Person
{
public string name;
public Person(string name)
{
this.name = name;
Console.WriteLine(name);
}
public void Say()
{
Console.WriteLine("你在干什么!");
}
}
public class Person1:Person
{
public Person1(string name):base(name)
{
}
public new void Say()
{
Console.WriteLine("弄啥呢!");
}
}
public class Person2:Person1
{
public Person2(string name) : base(name)
{
}
public new void Say()
{
Console.WriteLine("搞啥呢!");
}
}
static void Main(string[] args)
{
Person p = new Person("1");
p.Say();
Person1 p1 = new Person1("2");
p1.Say();
Person2 p2 = new Person2("3");
p2.Say();
PersonFun(p2);
Console.ReadLine();
}
public static void PersonFun(Person person)
{
person.Say();
}
图示 ↓
虚函数
virtual
返回值类型 函数名(参数列表)override
返回值类型 函数名(参数列表)public class Person
{
public string name;
public Person()
{
}
public Person(string name)
{
this.name = name;
}
public virtual void Say()
{
Console.WriteLine("我是父类的方法");
}
}
public class Person1 : Person
{
public Person1(string name)
{
}
public override void Say()
{
Console.WriteLine("我是字类的方法");
}
}
static void Main(string[] args)
{
Person1 p1 = new Person1("我是字类");
p1.Say();
Person p = new Person1("我是父类");
p.Say();
Console.ReadLine();
}
图示 ↓
abstruct
要放在抽象类里面
代码:
//抽象类
public abstract class Person
{
public void Fun(string name)
{
Console.WriteLine(name);
}
public abstract void Say();
}
public class Person1 : Person
{
public override void Say()
{
Console.WriteLine("asd");
}
}
static void Main(string[] args)
{
Person1 a = new Person1();
a.Say();
Console.Read();
}
代码:
public class Person
{
public virtual void Fun()
{
Console.WriteLine(1);
}
}
public class Person1 : Person
{
public sealed override void Fun()
{
Console.WriteLine(2);
}
}
public class Person2 : Person1
{
//这里报错 因为续承的Person1是密封函数
public override void Fun()
{
base.Fun();
}
}
static void Main(string[] args)
{
Person a = new Person1();
a.Fun();
Console.Read();
}
静态构造函数在程序运行期间只会执行一次
在第一次访问该类的时候调用 ?
代码
class Person
{
public static float age=88;
public static void Fun()
{
Console.WriteLine("我是父静态类!");
}
static Person()
{
Console.WriteLine("我是基静态类!");
}
}
class Per : Person
{
static Per()
{
Console.WriteLine("我是子静态类!");
}
}
static void Main(string[] args)
{
Per p = new Per();
Console.WriteLine();
Console.ReadLine();
}
代码:
//实例化动态数组
ArrayList score = new ArrayList();
//向动态数组中添加元素
score.Add(90);
score.Add(85.5f);
score.Add("English:100");
int[] array = { 90,80,70 };
//向动态数组中批量添加元素
score.AddRange(array);
//向动态数组中插入元素
score.Insert(2, "Math:80.5");
//删除动态数组中的元素
score.Remove(85.5f);
//删除的是单个约束,如果动态数组中没有该元素,就忽略
score.Remove(90);
//根据下标移除动态数组中的元素
score.RemoveAt(0);
score.AddRange(new string[] { "A", "B", "C", "A" });
//批量删除元素
score.RemoveRange(2, 3);
//如果数组中没有该下标所对应的元素,则也会出现越界异常
Console.WriteLine(score[1]);
//数组元素翻转
score.Reverse();
//一般想要删除某个元素,会先进行判断是否存在
bool containsA = score.Contains("A");
Console.WriteLine("containsA:" + containsA);
//判断数组中是否包含某个元素
if(score.Contains("A"))
{
score.Remove("A");
}
Console.WriteLine("Count:" + score.Count);
//给一个元素的值,查该值在动态数组中的下标
Console.WriteLine("IndexOf:" + score.IndexOf(790));
score.Clear();
score.AddRange(new float[] { 1.1f,5.7f,4.5f,9.8f,3,2,1});
//从小到大排序
score.Sort();
//清空动态数组
//score.Clear();
Console.WriteLine("-------------");
for (int i = 0; i < score.Count; i++)
{
Console.WriteLine(score[i]);
}
Console.WriteLine("-------------");
foreach (var item in score)
{
Console.WriteLine(item);
}
代码:
//初始化范型集合
List<int> list = new List<int>();
//添加元素
list.Add(200);
list.Add(250);
list.Add(280);
//批量添加元素
list.AddRange(new int[] { 1,3,5,6,7,9 });
//移除某个元素
list.Remove(280);
//通过下标移除某个元素
list.RemoveAt(0);
list.RemoveAt(0);
//批量删除
list.RemoveRange(0, 3);
int index = list.IndexOf(9);
Console.WriteLine(index);
Console.WriteLine("-----------");
foreach (var item in list)
{
Console.WriteLine(item);
}
–
代码:
e g eg eg:非范型为例😥
Object<=Stack stack = new Stack();
//进栈
stack.Push("我是第一个进去的");
stack.Push("我是第二个进去的");
stack.Push("我是第三个进去的");
//出栈
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
Console.Read();
//返回栈顶的元素Peek();
图示 ↓
😀😀😀略略略
–
e
g
eg
eg:进列
e
g
eg
eg:出列
代码:
e g eg eg:非范型为例😥
Queue queue = new Queue();
//进列
queue.Enqueue("我是第一个进去的");
queue.Enqueue("我是第二个进去的");
queue.Enqueue("我是第三个进去的");
//出列
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.Read();
图示 ↓
常用方法:
图示 ↓
代码:
Dictionary<string, int> dis = new Dictionary<string, int>();
dis.Add("我是第一个进去的", 1);
dis.Add("我是第二个进去的", 2);
dis.Add("我是第三个进去的", 3);
Console.WriteLine(dis.Values);
Console.WriteLine(dis.ContainsValue(2));
Console.WriteLine(dis.ContainsValue(3));
Console.Read();
图示 ↓
图示 ↓
–
e g eg eg:
–
–
图示 ↓
代码:
public class fanxing
{
}
public static void FX<T>(T sex, T age)
{
T temp = sex;
sex = age;
age = temp;
Console.WriteLine(age);
}
public static void FX<T>(T sex, T age, T a)
{
T temp = sex;
sex = age;
age = temp;
Console.WriteLine(age);
}
static void Main(string[] args)
{
FX<int>(7,8);
FX<float>(7,8);
Console.ReadLine();
}
e g eg eg 代码:
public static void faning<T>()
{
}
public static void faning<T,F>()
{
}
public static void faning<T,F,U>()
{
}
static void Main(string[] args)
{
faning<>
}
代码 e g eg eg:
e g eg eg:非范型为例😥
//定义委托
delegate void weituo(float momey);
class p1
{
public void zhao1(float momey)
{
Console.WriteLine("中介一需要:"+momey+"$");
}
public void zhao2(float momey)
{
Console.WriteLine("中介二需要:"+ momey + "$");
}
public void zhao3(float momey)
{
Console.WriteLine("中介三需要:"+ momey + "$");
}
public void zhao4(float momey)
{
Console.WriteLine("中介四需要:"+momey + "$");
}
}
internal class Program
{
static void Main(string[] args)
{
p1 p = new p1();
weituo we;
we = p.zhao1;
we += p.zhao2;
we += p.zhao3;
we += p.zhao4;
we(123);
Console.Read();
}
}
代码 e g eg eg:😥
class p1
{
public void wcs()
{
Console.WriteLine("我是无参数的中介需要:" + "18456456456456"+ "$");
}
public void zhao1(float momey)
{
Console.WriteLine("中介一需要:"+momey+"$");
}
public void zhao2(float momey)
{
Console.WriteLine("中介二需要:"+ momey + "$");
}
public void zhao3(float momey)
{
Console.WriteLine("中介三需要:"+ momey + "$");
}
public void zhao4(float momey)
{
Console.WriteLine("中介四需要:"+momey + "$");
}
}
internal class Program
{
static void Main(string[] args)
{
p1 p = new p1();
//使用系统委托
//无参数
Action action;
action = p.wcs;
action();
//参数
Action<float> action1;
action1 = p.zhao1;
action1 += p.zhao2;
action1 += p.zhao3;
action1 += p.zhao4;
action1(182);
Console.Read();
}
}
图示 ↓
代码 e g eg eg:😥
class Hout
{
}
class p1
{
public string Func1()
{
return "有返回值函数无参数:";
}
public Hout Func2(string name)
{
Console.WriteLine("有返回值函数有参数:" + name);
return null;
}
}
static void Main(string[] args)
{
p1 p = new p1();
Func<string> func;
func = p.Func1;
Console.WriteLine(func());
Func<string, Hout> func1;
func1 = p.Func2;
Hout a = func1("先生");
Console.WriteLine(a);
Console.Read();
}
代码 e g eg eg:😥
class p1
{
public Action<string> action;
public string name;
public int age;
public p1(string name, int age)
{
this.name = name;
this.age = age;
}
public void isAction(string age)
{
Console.WriteLine("我是个中介:" + age);
if (action != null)
{
action(age);
Console.WriteLine("我是个中介:" + age);
}
}
}
internal class Program
{
static void Main(string[] args)
{
p1 p = new p1("先生", 18);
p.action = delegate (string value)
{
Console.WriteLine(value);
Console.WriteLine("我好蒙啊2");
};
p.action += read;
p.isAction("我好蒙啊1");
Console.Read();
}
public static void read(string name)
{
Console.WriteLine(name);
Console.BackgroundColor = ConsoleColor.Red;
Console.ForegroundColor = ConsoleColor.Black;
}
}
图示 ↓
–
调试步骤 ↓
给想要暂停的代码行添加断点
开始调试
通过监视或局部变量窗口,去看此时你想观察的变量的值
如果想看变量or对象的内存地址
1、找到即时窗口
2、&变量名
图示 ↓
以上是个人学习C#的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波