1、字段
字段以”_”开头。例如:
public static string _name;
this代表当前类的对象;
类是不占内存的,实例化的对象才是占对象的。
2、属性
属性作用是保护字段,对字段的赋值和取值进行限定。
属性的本质就是get set两个方法
属性是对字段的封装;
封装的快捷键:Ctrl + R + E
fileds:字段
method:方法
property:属性
*****字段就是女人,属性就是男人
字段属于数据非常重要,需要保护起来,外界访问时访问属性即可
public class Person
{
//字段
public string _name;
public int _age;
public char _gendar;
//属性
public string Name
{
get { return _name; }
set { _name = value; }
}
public void Test()
{
Console.WriteLine($"我是{this._name},我今年{this._age},我是{this._gendar}生!");
}
}
3、静态与非静态的区别
static:静态标识符
1、在非静态成员中,既可以有实例成员,也可以有静态成员。
2、在调用实例成员的时候,需要使用 对象名.实例成员
在调用静态成员时,需要使用 类名.静态成员
总结:静态成员必须使用类名去调用,实例成员必须使用对象去调用。
静态函数中只能访问静态成员,不允许访问实例成员。
实例函数中既可以使用静态成员,也可以使用实例成员。
静态类中只允许有静态成员,不允许有实例成员。
静态类不允许被实例化(因为静态类中的所有成员必须使用类名曲调用,所以创建静态类的对象没有意义)
使用:
1、如果想要类当做一个工具类,可以使用静态类(工具类:经常使用的方法);使用的时候直接使用 类名.方法即可,不需要创建实例化对象
2、静态类在整个项目中资源共享。静态类只有在程序结束时才会释放资源。
4、构造函数
构造函数作用是帮助我们初始化对象,对对象的每一个成员赋值,是一个特殊的方法。
1、构造函数没有返回值,连Void也不能写
2、构造函数的名称必须跟类名一样
类中会有一个默认的无参数的构造函数,当你写一个新的构造函数之后,不管有无参数,那个默认的构造函数都会被替代。
创建对象后,先执行构造函数,所以可以在构造函数中做初始化处理。
使用
class Program
{
static void Main(string[] args)
{
Student zsStudent = new Student("张三",25,100);
//zsStudent.Name = "张三";
//zsStudent.Age = 25;
//zsStudent.Math = 100;
zsStudent.Show();
Student xlStudent = new Student("小兰",25,100);
//xlStudent.Name = "小兰";
//xlStudent.Age = 25;
// xlStudent.Math = 100;
xlStudent.Show();
Console.ReadKey();
}
}
类
public class Student
{
//类中可以写字段 属性 方法 构造函数
public Student(string name ,int age ,int math)//构造函数,
{
this.Math = math;
this.Name = name;
this.Age = age;
}
private int _age;
public int Age { get => _age; set => _age = value; }
private string _name;
public string Name { get => _name; set => _name = value; }
private int _math;
public int Math { get => _math; set => _math = value; }
public void Show()
{
Console.WriteLine($"我叫{Name},我今年{Age}岁,我的数学今年考了{Math}分!");
}
}
5、 New关键字的作用
person zs = new person()
new总共帮我们做了三件事:
1、在内存中开辟空间
2、在开辟的空间中创建对象
3、调用对象的构造函数进行初始化对象
6、构造函数的重载
在使用过程中可能并不需要传所有的参数,这时候也就用到了构造函数的重载。
函数名相同,但是参数不相同。
//类中可以写字段 属性 方法 构造函数
public Student(string name ,int age ,int math)//构造函数,
{
this.Math = math;
this.Name = name;
this.Age = age;
}
public Student(string name, int age)//构造函数重载,只传入名称和年龄
{
this.Name = name;
this.Age = age;
}
7、this关键字
1、代表当前类的对象
2、在类当中显示的调用本类的构造函数 :this
//类中可以写字段 属性 方法 构造函数
public Student(string name ,int age ,int math)//构造函数,
{
this.Math = math;
this.Name = name;
this.Age = age;
}
//构造函数重载,只传入名称和年龄
public Student(string name, int age):this(name,age,0)
{
//创建对象调用此重载构造函数时,会先调用本构造函数然后再调用上面那个参数最齐全的构造函数,
//然后调用完成后再次回到此构造函数中,以此达到代码复用的作用
}
8、析构函数
析构函数在程序结束时会被调用,常用于释放资源。
//析构函数
~Student()
{
Console.WriteLine("我是析构函数");
}
9、命名空间
NameSpace (命名空间),用于解决类的重名问题,可以看做类的“文件夹”;
如果代码和被使用的类在一个namespace则不需要using
如果在当前项目中没有这个类的命名空间,需要我们手动导入命名空间:
1、用鼠标点击
2、光标放在类上,然后按快捷键 Alt + Shift + F10
3、记住命名空间,手动引用
在一个项目中引用另一个项目的类:
1、引用—右键,添加引用
2、using引用命名空间
在不同命名空间下的类调用有两种方法:
1、写全称 命名空间.类名
2、先using引用命名空间,在调用
10、值类型和引用类型
区别:
1、值类型和引用类型在内存上储存的地方不一样
2、在传递值类型和传递引用类型的时候,传递的方式不一样。
值类型我们称之为值传递,引用类型我们称之为引用传递。
值类型:int,boo了,double,char,decimal,struct,enum
引用类型:string ,自定义类,数组
储存:值类型的值是储存在内存的栈当中,引用类型是储存在内存的堆中
引用类型虽然储存在堆中,但是在栈中也有开辟空间并且这个空间指向堆中的地址。
11、字符串
1、字符串的不可变性
2、当给字符串重新赋值后,原本的值并没有销毁,而是在堆中重新开辟一块空间储存新的值;
当程序结束后,GC扫描整个内存,如果发现有些内存没有任何指向则立即销毁。
可以将字符串看做是char类型的一个数组。
字符串格式详解
如果需要写一个方法来改变字符串的值,那么这个方法是不需要返回值的,因为字符串属于引用类型,可以直接改变
字符串提供的各种方法:
1、Length:获得字符串中字符的个数
2、ToUpper():将字符串转换成大写形式
3、ToLower():将字符串转换成小写形式
4、Equal(lessone.Equals(lessTwo,StringComparison.CurrentCultureIgnoreCase)):比较两个字符串是否一样
5、Split() 分割字符串,返回字符串类型的数组
6、Replace() 字符串替换 Contains()字符串查找
7、Substring() 字符串截取,包含要截取的位置
8、StartsWith();EndWith();是否以某某字符开始,是否以某某字符结尾
9、IndexOf()第一次某个字符的位置 Lastindexof() 最后一次出现某个字符的位置
10、Trim() TrimStart()TrimEnd()字符串去掉所有空格,去掉前面的空格 去掉后面的空格
11、Join()字符串中加入新的字符
字符串转大小写ToLower ToLower
string s1 ="aaa";
s1 = s1.ToUpper();// 将S1转成大写
string s2 ="BBB";
s2 = s2.ToLower()://将字符串转换成写
字符串比较Equals
if (lessone.Equals(lessTwo,StringComparison.CurrentCultureIgnoreCase))
{
Console.WriteLine("你们俩喜欢的课程一样");
}
else
{
Console.WriteLine("你们俩喜欢的课程不一样");
}
字符串分割Split
string s = "a b dfg _ + = ,,, fdf ";
//分割字符串split
char[] chs = { ' ', ',', '_' ,'+','='};
// 字符串分割,选项设置为不返回空的字符串数组 StringSplitOptions.RemoveEmptyEntries(移除空的选项)
string[] str= s.Split(chs,StringSplitOptions.RemoveEmptyEntries);
String re="";
for (int i = 0; i < str.Length; i++)
{
re += str[i];
}
Console.WriteLine(re);
Console.ReadKey();
字符串替换Replace、查找Contains
string str = "国家主席";
bool re = str.Contains("主席");// 查找字符串中是否有“主席”的值
if (re)//如果有,则将其替换成“**”
{
str=str.Replace("主席","**");
}
Console.WriteLine(str);
Console.ReadKey();
字符串截取 Substring
string str = "今天天气好晴朗";
str = str.Substring(3,1);
Console.WriteLine(str);//输出“气”
string strNew = str.Substring(1);
Console.WriteLine(str);//输出“天天气好晴朗”
字符串是否以开头StartsWith ;是否以结尾EndsWith
string str = "今天天气好晴朗";
if (str.StartsWith("今天"))//是否以今天开头
{
Console.WriteLine("是的");
}
else
{
Console.WriteLine("不是的");
}
if (str.EndsWith("晴朗"))//是否以晴朗结尾
{
Console.WriteLine("是的");
}
else
{
Console.WriteLine("不是的");
}
Console.ReadKey();
查找字符串第一次与最后一次的位置 IndexOf() LastIndexOf()
string str = "今天天气好晴朗";
int index = str.IndexOf('天',);
Console.WriteLine(index);
string path = @"c:\a\s\s\d\df\sd\fsd\fsdf\sdf\sdfsd\fsd\f\仓老师.wav";
index = path.LastIndexOf("\\");
path = path.Substring(index+1);
Console.WriteLine(path);
Console.ReadKey();
字符串去空格
string str = " hahah ";
string str1, endstr, startstr;
str1 = str.Trim();// 去掉字符串前后的空格
endstr = str.TrimStart();//去掉前面的空格
startstr = str.TrimEnd();//去掉后面的空格
Console.WriteLine(str1);
Console.WriteLine(endstr);
Console.WriteLine(startstr);
Console.ReadKey();
判断字符串是否为Null 或者为空
string str11 = null;
string str12 =""”;
if (string.IsNullOrEmpty(str11))
{
Console.WriteLine("是的");
}
if (string.IsNullOrEmpty(str12))
{
Console.WriteLine("是的");
}
//都输出为是的
字符串加入
string[] name = { "张三", "张三", "张三", "张三", "张三", "张三", };
//转换为|张三|张三|张三|张三|张三|张三|张三|张三|张三
//Join的参数右parmas修饰,所以有两种写法
string strNew = string.Join("|",name);
string strNew1 = string.Join("|", "张三", "张三", "张三", "张三", "张三", "张三");
Console.WriteLine(strNew);
Console.WriteLine(strNew1);
Console.ReadKey();