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();