面向对象:
圆可以画在黑板上。
黑板上可以被画个园 ==》一般我们把被动(黑板)的作为对象。
在代码中描述一个对象,通过描述这个对象的属性(特征)和方法(行为)。
万物皆对象(看得见摸得着的,能描述的才行);
类:
把具有相同属性跟方法的对象提取出来封装在一起就是类。
类就是一个模子,确定对象将会拥有的(属性)特征和(方法)行为。
类是盖大楼的图纸,对象 是根据图纸盖出来的大楼。
语法:
public class 类名
{
(Field)字段;
(Method)属性;
(Property)方法;
}
对象的实例化:创建对象的过程
类是不占内存了,而对象占内存
path:C-_learn\object\One ==>class man
属性:
public 公共的,外界可访问的。
private 私有的,只有类中才可访问。(默认类型)
private int -age; //私有字段(字段)
public int Age //通过Age共有属性可以访问(属性)
{
get{return _age} //取值时执行get
set{_age = value} //赋值时执行set
}
path:C-_learn\object\One ==>class SuperMan
static特性:
- 静态成员需要类名去调用,非静态成员用对象去调用.
- 静态方法中只能访问静态成员,不能访问非静态成员
- 非静态函数中既能使用静态成员,也能使用非静态成员
- 静态类是不用实例化的,直接用类名调用来用
- 静态类中不允许出现非静态(实例)成员
- 静态类在整个项目中共享,程序结束才释放静态资源。
构造函数:
作用:帮助我们创建对象时初始化对象。
- 构造函数只是一个特殊的方法。没有返回值,还不能写void
- 构造函数名跟类名必须相同。
- 构造函数可以有重载
- 类中没有写构造函数时会自动提供一个默认的无参构造函数。
语法:
public class ClassName
{
public ClassName(string name)
{
/* 实例化对象后最先执行构造函数。*/
this.Name = name;
}
string _name;
public string Name
{
get{return _name;}
set{_name = value;}
}
}
/******************************************************/
调用:
ClassName Object = new ClassName("Superman");
path:C-_learn\object\Two ==>class ClassName
析构函数:
只有在程序结束时调用,并非类使用完调用。
语法:
public class ClassName
{
~ClassName()
{
//需要释放资源的代码。
}
string _name;
public string Name
{
get{return _name;}
set{_name = value;}
}
}
path:C-_learn\object\Two ==>class Student
/***********
命名空间:
命名空间时类的一个集合
快速导入命名空间:
鼠标放到使用的类上,会自己弹出来
alt + shift + F10
在一个项目中引用另一个项目的类:
1.添加引用
2.再在有调用的地方(文件)添加命名空间。
值类型和引用类型
数值类型直接存储在栈上
引用类型存储在堆上==》string 对象 数组(malloc, new的都为引用类型)
sting类型
sting开辟的空间后又重新指向遗留的内存垃圾会又GC(垃圾回收器)自动回收
一切类型都可以调用 .tostring 转换为字符串类型。
详解:
- string str1 = “123”;
- string str2 = “123”
- 当两个字符串值相同时,str1 跟 str2 都指向同一个堆区,如果需要重新赋值会在堆上重新开辟一个空间写入新值,并指向。
class Program
{
static void Main(string[] args)
{
string name = "wK"; //在堆上开辟了一个空间,用name指向
string she = name; //在堆上开辟了一个空间,用she指向,把name指向的地址空间的内容拷贝到了she指向的内存空间
name = "yL"; //在堆上重新开辟的了一个地址空间存储yL,再把name重新指向有yL的堆区。
}
}
class Program
{
static void Main(string[] args)
{
string str = "hello world";
Console.WriteLine(str[3]); //字符串可以通过下标访问元素,
//str[3] = 'a'; //但不能通过下标改变元素
char[] chr = str.ToCharArray(); //把字符串类型转换为数组类型
chr[3] = 'b';
str = new string(chr); //再把数组类型转换为给字符串
Console.WriteLine(str);
}
}
字符串分割:
class StringSegmentation
{
public static void PrintfStringSeg()
{
string _str = "he+l__l>o w+o_r l d";
char[] _seg = { ' ', '+', '_', '>' }; //需要分割出去的字符
string[] str = _str.Split(_seg, StringSplitOptions.RemoveEmptyEntries); //分割不填充出去的字符位不填充空字符
for (int i = 0; i < str.Length; i++)
{
Console.Write(str[i]);
}
Console.WriteLine();
}
}
path: C-_learn\object\Four ==>class StringSegmentation
字符串替换
static void Main(string[] args)
{
string str = "what your name is yinli";
if (str.Contains("yinli")) //查找是否有关键字yinli
{
str = str.Replace("yinli", "lili"); //替换yinli为wangKing
}
Console.WriteLine(str);
}
字符串截取:
static void Main(string[] args)
{
string str = "what is your name yinli";
str = str.Substring(0,4); //截取字符串,从索引0开始截取4个字符
Console.WriteLine(str);
str = str.Substring(3); //截取第3个字符
Console.WriteLine(str);
}
判断字符串的开始跟结尾:
static void Main(string[] args)
{
string str = "what is your name yinli";
if (str.StartsWith("what")) //判断字符的开始
{
Console.WriteLine("str字符串是以what开始的.");
}
else
Console.WriteLine("不是");
if (str.EndsWith("what")) //判断字符串的结尾
{
Console.WriteLine("str字符串是以what开始的.");
}
else
Console.WriteLine("不是以what结尾的");
}
字符串补充:
- Indexof() —>判断某个字符串在字符串中第一次出现的位置,如果没有返回-1。
- LastIndexof() —> 判断某个字符串在字符串中最后一次出现的位置,如果没有返回-1.
- Trim() —> 去掉字符串中前后空格
- TrimEnd() —>去掉字符串中结尾的空格
- TrimStart() —> 去掉字符串中前面的空格
- string.IsNullOrEmpty() —> 判断一个字符串是否为空或者为null
- string.Join() —> 将字符串按照指定的字符串连接,返回一个字符串。