C# -----数据类型 字符串 集合 面向对象
1.常见的数据类型
bool sbyte(带符号 8bit存储) byte(8位无符号) short ushort int uint (没有负数) long ulong char float double decimal(适用于金额的计算) string object
2.默认类型转换
a.当一个子类想转换成它的父类的时候
b.当短精度向高精度转换时 byte —int----long-----float----double
c.decimal所有的整型均可以默认转换为decimal 即除了double float以外有数字类型的均可以
3.数据类型判断:is
4.强制类型转换
在变量前面加目标类型强制转换 (在转型失败时 会抛出错误 直接终止代码)
使用as关键字 标识 将变量x当做类型Y (C c2 = x as Y) (当转型失败时将c2置为null 当前步骤不会抛出异常 如果对于空引用没有进行处理 那么会在后续中抛出空异常)
5.强制 类型转换
存在精度丢失 但是可以接受
例如
long lval =1000; int i = (int)lval;
使用System.Convert类 Convert.ToXXX() 其中 XXX 表示转型目标对象
字符串!
String 变量的声明方式两种:
1.直接使用字面值 比如 String s = “123456”;
2.直接使用构造器 比如 String s = new String (“123123”);
String的构造函数
- public String ( char c , int count); 生成数量为count的由C组成的字符串 不包括其他字符
- public String(char [ ] value ) ; 将字符数组value 转换为字符串,字符串等于字符数组依次连接生成的字符串
- public String ( char [ ] value, int startIndex , int length );将value中的部分元素拼接成字符串 有起始位置 和长度 自行选择
空字符串与Null的含义
- 空字符串是一个长度为0的字符串 null没有长度 如果强行获取.length将会抛出异常
- 空字符串可以调用字符串的所有方法 null无法调用字符串对象的任何方法
- 空字符串指向的是一个内存中的某个地址 null则没有任何指向
判断字符串是否为空
-
string str = string.Empty;
-
bool result = str == “” || str string.empty || str.Length0;//用布尔值来判断他里面是否没有东西 是否为空 并且他的长度等于0
c#提供了一个内部默认的支持方法:
string.IsNullOrEmpty(value)
string.IsNullOrWhiteSpace(value) 需要一个非空白字符的字符串的方法
主要集合
数组 链表 列表 set 字典 在c#中 list是类不是接口 接口是IList
- Array数组
特点是一经初始化 无法再对数组本身进行增删改查 虽然提供了一些修改数组的扩展方法 但是基本上都会返回新的数组对象
-
常用方法
string item0 = strArr[0];//取出第一个 元素 string item2 = atrArr[2];//取出第二个元素 strArr[0] = "3";//将数组中的第一个数字替换为3 -------------------------------------------------- int length = strArr.length;//获取一个整型的长度 long longLength = strArr.LongLength;//获取一个长整形的长度 ----------------------------------------------------- for (int i = 0 ; i< strArr.length; i++ ) { string it = strArr[i]; }//for循环 foreach (string it in strArr) { //依次循环,不需要下标,操作更快 }//foreach 循环 ----------------------------------------------------- //CopyTo 复制到 string[] strArr1 = new string[]{"1","2","3","4","5","6","7","8","9","10"}; string[] strArr3 = new string[10]; strArr1.CopyTo(strArr3, 0); //strArr3 = {"1","2","3","4",'5","6","7","8","9","10"} //sort排序 是array提供的一个静态方法 Array.Sort(strArr1);//自动进行排序 由小到大进行 //Clone() 获得一个浅拷贝的数组对象
-
List列表
//1.初始化 List<string> list = new list<string >();//初始化一个空的列表 List<string> list1 = new List<string >{"12","2"};//初始化一个包含两个元素的列表 List1 = new List<string >(100);//初始化一个空的列表,并指定list的初始容量为100 list = new List<string >(list1);//使用一List/array初始化一个列表 -------------------------------------------- //常用的方法 Count() LongCount() 一个是 int类型 一个是Long 类型 List<string > list = new List<string >(); list.Add("12");//在list中添加元素 List<string> list1 =new list<string>{"14","12"}; list.AddRange(list1)//在list 末尾添加list1的元素值。 --------------------------------------------------- //插入元素方式 Innsert(int index, T item) // 在index下标处插入一组元素 ,该下标以及之后的元素一次后移 arr1.InsertRange(2,arr2); //判断元素 是否有包含 包含 则返回true 否则返回false arr.Contains(8); //删除指定元素 Renove(T item ) arr.Remove(3); RemoveAt( int index )//删除位于下标的元素 RemoveRane(IEnumber<T> items)//删除一组元素与Remove一致 如果要删除元素不在列表中 则元素不会发生变化 GetRange(int index, int count )//从列表中获取第一个子列表,从index开始 获取count 个元素 如果源列表中从index开始剩余的元素比不足count个 则会报错 -------------------------------------------------- //不常用但有用的方法 Clear() //删除所有元素 Reverse()//调转顺序 将 列表按照从尾到头的顺序进行排列 IndexOf(T item ) //查找下标 如果,没有找到元素 则返回-1 Sort()//排序 对 列表进行排序 调用方法后 会按照默认排序方法返回一个排序结果
-
Set集合
//Set 集合中不能包含重复的元素 如果尝试存入重复元素集合元素将不会发生任何变化 Set集合中元素的顺序和存放顺序不一定相同 常用的Set集合有HashSet<T> SortSet<T> Set<T> set = new HashSet<T>();//初始化 set.Add(item );//添加元素 set.Remove(item);//删除集合中等于item的元素 UnionWitn set.UnionWith() //并集 ExceptWith set.ExceptWith()// 差集 IntersectWith set.IntersectWith() // 交集 SymmetricExceptWith set.SymmetricExceptWith() //余集 Contains set.Contains(1); //判断集合中是否包含目标元素 返回true false
-
Dictionary 字典
Dictionary<string , int > dict = new Dictionary<string ,int>();//字典的初始化相当于键值对 dict.Add("1",2);//添加一个元素 键和值 .Count // 获取 键值对的数量 .Keys // 获取 字典里面所有的键 然后把它看作是一个 hashset来返回 .Remove() // 删除字典中对应的元素 --------------------------------------------------------- ContainsValue()//是否包含值 Values //获取值的集合 和上面的keys 差不多的
-
其他集合
- ArrayList 返回值是Obbject 类型
- SortedList 排序键值对的集合
- HashTable 根据hash代码组织进行的集合
- Queue 队列 初始化: Queue queue = new Queue(); Queue queue =new Queue();
- LinkedList 链表
- Stack stack 栈
面向对象
- 创建一个类
public class Person {
private string name ;//字段
public string name //属性
{
get { return name;}
set{name = value;}
}
public Person (){
// 方法
}
}
- 面向对象三大特征 封装 继承 多态
- 访问权限控制符 private:同属于一个 类的 成员才能够访问 protected:当前类的成员 子类可以访问 internal 默认访问权限 类的internal关键字可以省略 方法省略则表示的是protected public 公开 所有能引用类的地方都能访问public对象 最开放的权限
class HellWord
{
static void Main (string[] args )
{
Person p = new Person();
p.SayHello();
}
}
public class Person
{
private string name ;
public string Name
{
get { return name }
set { name=value }
}
public void SayHello()
{
Console.Write("你好呀,我叫"+Name);
}
}
//继承 一个类只有一个父类 class B:A 表示B继承A
//关键字 virtual 关键字 生命函数为虚函数 表示该子类可能会重写该方法
// 关键字 override 用在子类 用来声明 该方法是重写父类的方法
//new 跟实例化对象的new不同 这个放在方法前的意思是该方法会隐藏父类的方法实现
//saled 如果看到一个类有这个标记 那么 需要知道这个类是不可以被继承的类
public class A
{
public virtual void Say()
{
}
public void Look()
{
}
}
public class B : A
{
public override void Say()
{
Console.Write("我可是会说话的");
}
}
-----------------------------------------------------
- 类和接口 类和接口的声明方式不同 类用的关键字是class 而接口用的关键字是interface 类是继承 接口是实现 一个类只能有一个父类 接口可以有多个实现 接口中的所有方法都是public的 因为接口就是用来定义规范的,所以一旦他的方法不是public的话那将没有任何的意义
public class Demo
{
}
public interface IDemo
{
string Method ();
}
public class Demo3 : Demo,IDemo
{
public string Method()
{
return "test";
}
string IDemo.Method()
{
return "test2";
}
}
//先继承 后实现 实现接口的方法 上面写了两种 不同的地方是他们的使用 接口优先使用接口名.方法名 作为实现方法 两种方法可以共存
Object 类 常用方法 四个基本方法
-
Equals(object obj) 判断两个对象是否相等的依据
-
GetType() 返回这个对象的类型 反射中
-
ToString() 返回字符串 获得一个对象的文字描述 默认返回的是对象的地址描述信息,这个方法建议重写
-
GetHashCode() 返回hash值 某些集合和程序机制会以hashcode作为元素的相等性判断依据 所以建议在重写Equals之后还要重写这个方法 并保证两个方法对于相同的对象做相等性结果判定 应该是表现一致。
-
面向对象模拟
class program { static void Main(string [] args ) { Person p = new Person(); p.Name="三三"; p.age="23"; p.gender="叭" p.Say(); Console.ReadKey(); } } public class Person { private string _name; public string Name { get{return name} set{ _name = value} } private int _age; public int Age { get {return _age} set { if (value<0 || value>100) { value = 0;} _age = value; } } private char _gender; public char Gender { get{ if(_gender !="男"&&_gender !="女") { return _gender = "男"; } return _gender; } set{ _gender = value; }`在这里插入代码片` } public void Say(){ Console.WriteLine("我是{0},我今年{1} ,我是{3} 生,我可以说话",this.Name,this.age,this.gender) }`在这里插入代码片` }
public class Person { private static string _name; public static string Name { get{return Person._name;} set{Person._name = value;} } }
文章同时借鉴了 --不做码农的开发者 该公众号的文章以及自己的整理。