较其他语言的不同,写给自己看的
1.数据类型decimal(金钱类型):用来存储金钱,值后面需要加上一个m.
2.命名规范
1、Camel 骆驼命名规范。要求变量名首单词的首字母要小写,其余每个单词的首字母要大写。
多用于给变量命名。
2、Pascal 命名规范:要求每个单词的首字母都要大写,其余字母小写。多用于给类或者方法命名。
3.转义字符:
\b:表示一个退格键,放到字符串的两边没有效果
\r\n:windows操作系统不认识\n,只认识\r\n
@符号
1、取消\在字符串中的转义作用,使其单纯的表示为一个'\'
2、将字符串按照编辑的原格式输出
4.编译器直接支持的数据类型为基元类型(Primitive type)。
基元类型直接映射到Framework类库(FCL)里面中存在的类型。例如:C#中的int 直接映射到System.Int32类型。
5.交错数组:
int[]表示数组,在后面在加个[]表示数组的数组。交错数组元素的维度和大小可以不同。
//声明一个交错数组ja,ja 中有三个元素。分别是 ja[0],ja[1],ja[2]每个元素都是一个数组
int[][] arrs= new int[3][];
//以下是声明交错数组的每一个元素的,记住每个数组的长度可以不同噢.
arrs[0] = new int[] {1,2,3,4,5,6};
arrs[1] = new int[] {7,8,9,1,8956};
arrs[2] = new int[]{2,5,6,86};
arrs.Length是其内部数组个数的值,也就是3,所以遍历就可以用
int[][] arrs ={
new int[]{1,2,3,4,5,6},
new int[]{7,8,9,1,8956},
new int[]{2,5,6,86}
};
for (int i = 0; i < arrs.Length; i++)
{
for (int j = 0; j < arrs[i].Length; j++)
{
Console.WriteLine(arrs[i][j]);
}
Console.WriteLine("________");
}
6.占位符(复合格式设置)
{ index[,alignment][:formatString]}
- 索引组件index是必须的:是一个从 0 开始的数字,参数说明符为 0 的格式项列表中的第一个对象,参数说明符为 1 的格式项列表中的第二个对象,依次类推。
- 对齐组件alignment:是一个带符号的整数,设置字段宽度。为正就是右对齐,为负就是左对齐
- 格式字符串组件formatString:格式化输出
**预定义的数字格式**
C或c Currency 货币格式
D或d Decimal 十进制格式(十进制整数,不要和.Net的Decimal数据类型混淆了)
E或e Exponent 指数格式
F或f Fixed point 固定精度格式
G或g General 常用格式
N或n 用逗号分割千位的数字,比如1234将会被变成1,234
P或p Percentage 百分符号格式
R或r Round-trip 圆整(只用于浮点数)保证一个数字被转化成字符串以后可以再被转回成同样的数字
X或x Hex 16进制格式
**预定义的时间格式 :**
G 显示时间到秒2020/12/23 15:43:10
g 显示时间到分2020/12/23 15:43
d 使用你当前区域性的短日期格式显示日期。如,2020/12/23
D 根据你当前区域性的长日期格式显示日期。如,2020年12月23日(中国)
T 使用你当前区域性的长时间格式显示时间;通常包括小时、分钟、秒。 如 11:07:31
t 使用您的当前区域性的短时间格式显示时间。 例如 11:07
f 根据您的当前区域性的格式显示长日期和短时间。 如 2020年12月23日 11:07
F 根据您的当前区域性的格式显示长日期和长时间。 如 2020年12月23日 11:07:31
g 根据您的当前区域性的格式显示短日期和短时间。 如 2020/12/23 11:07
M或m 显示日期的月份和月中哪一天。 例如 12月23日
R或r 根据属性设置日期的格式 。 例如Wed, 23 Dec 2020 15:52:17 GMT
s 将日期和时间设置为可排序索引格式。 例如 2008-03-12T11:07:31。
u 将日期和时间设置为 GMT 可排序索引格式。 例如 2008-03-12 11:07:31Z。
U 将具有长日期和长时间的日期和时间设置为 GMT 格式。 例如2020年12月23日 7:52:17
Y或y 将日期设置为年和月的格式。 例如2020年12月
7.array类的一些方法:
- BinarySearch(Array, Object),用于 排序 数组的查找,需要两个参数,第一个是需要查找的数组名,第二个是需要查找到数据,返回找到数据的索引值 。找不到,返回负数(先排序在用,否则可能会出错 )
- Sort():排序
- Reverse():数组反转
- Clear():清除,将数组中的某个范围的元素设置为每个元素类型的默认值。
- Resize():将一维数组的元素数更改为指定的新大小。其实是重新创建数组,将旧数组的值复制到里面去
8.优先级
9.自增自减
int a = 123;
int result;
result = ++a;
Console.WriteLine("{0},{1}",result,a);
Console.ReadKey();
//输出124,124,“先加后用”
int a = 123;
int result;
result = a++;
Console.WriteLine("{0},{1}",result,a);
Console.ReadKey();
//输出123,124,“先用后加”
10.3种将字符串转化成值类型的方法
- Convert.to… (底层是调用的int.parse)
- int.parse (如果有错误,会抛异常)
- int.TryParse (返回一个bool类型的值,true表示成功,false表示失败)
11.空接合操作符
??
表示如果第一个值为空,则用第二个值
a??b;
如
string a=null;
string b ="bbbb";
string c=a ?? b;
Console.WriteLine(c);
Console.ReadKey();//输出bbbb
12.一个关于十进制转二进制的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace firstDemo
{
class Program
{
static void Main(string[] args)
{ //十进制转二进制
const int size = 64;
ulong value;
char bit;
Console.WriteLine("输入一个数");
value = (ulong)long.Parse(Console.ReadLine());//用long类型来接收,这样的话如果是负数进行强转内存中的值也不会变
ulong mask = 1ul << size - 1; //1ul是ulong类型的数1,把1左移63位,到第64位,来屏蔽其他63位
for (int count = 0; count < size; count++)
{
bit=((mask & value) != 0)?'1':'0';//进行按位与
Console.Write(bit);
mask>>=1;//mask=mask>>1 每次mask的值向右移动一位,
//假设:
//mask :1000 0000
//value:0000 0001
//每次mask向右移动1位来进行判断,只有当value的位值为1时,得到的结果才是1,输出0000 0001
}
Console.WriteLine();
}
}
}
13.C#中的常量
const int a=5;//区别于变量
14.枚举
[public] enum 枚举名(要符合Pascal命名规范)
{
值1,
值2,
值3,
........
}
如果将字符串转换成枚举类型则需要下面这样一行代码:
(要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型),"要转换的字符串");
如果转换的字符串是数字,则就算枚举中没有,也会不会抛异常。
如果转换的字符串是文本,如果枚举中没有,则会抛出异常。
15.结构体
[public] struct 结构名
{
成员;//字段
}
变量在程序运行期间只能存储一个值,而字段可以存储多个值。
16.return的作用
- 在方法中返回要返回的值。
- 立即结束本次方法。
17.out、ref、params
- out参数:out参数就侧重于在一个方法中可以返回多个不同类型的值。
- ref参数:能够将一个变量带入一个方法中进行改变,改变完成后,再讲改变后的值带出方法。 ref参数要求在方法外必须为其赋值,而方法内可以不赋值。(和c的指针作用差不多)
- params可变参数:将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。params可变参数必须是形参列表中的最后一个元素。
18.C#的预处理指令
所谓预处理,可以理解为在程序运行之前的一个预先处理。
- #define:定义一个字符,如果定义了就返回true,否则为false
- #undef:取消定义
- #if 它用于测试符号是否为真如果为真就执行;
- #else 如果不为真,就执行else里面的
- #elif 这个相当于else if 进行第二次的判断
- #endif 结束标志
- #region 指定一个可展开或折叠的代码块。
- #endregion #region的结束标志
-
#warning 编译器主动发出警告,允许你从代码中的特定位置生成 CS1030 第一级编译器警告
#pragma warning 可以启用或禁用特定警告。
#pragma warning disable warning-list
#pragma warning restore warning-list
参数
warning-list
以逗号分隔的警告编号的列表。 “CS”前缀是可选的。
未指定警告编号时,disable 会禁用所有警告,restore 会启用所有警告。
- #error 主动出一个错误
- #line
1.#line 行号 “名称” --->将下面的行改变行号为定义的行号
2.#line default --->恢复默认行号
3.#line hidden 指令对调试器隐藏若干连续的行,这样当开发人员在逐句通过代码时,将会跳过 #line hidden 和下一个 #line 指令(假定它不是另一个 #line hidden 指令)之间的所有行。
19.类中的结构
- 字段:字段一般是封装起来的
- 属性:用来改变字段的值的,对字段进行一个保护
- 方法
class Person
{
//字段
private string _name;
int _age;
private string _sex;
//属性
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
public string Sex
{
get { return _sex; }
set { _sex = value; }
}
//方法
public void OutMethord()
{
Console.WriteLine("{0}的年龄是:{1},是个{2}的", this.Name, this.Age, this.Sex);
Console.ReadKey();
}
}
get和set的底层:
public void set_Name(string value)
{
this._name = value;
}
public string get_Name()
{
return this._name;
}
20.静态和非静态
- 在非静态类中,既可以有实例成员,也可以有静态成员。在调用实例成员的时候,需要使用对象名.实例成员;
- 静态函数中,只能访问静态成员,不允许访问实例成员。在调用静态成员的时候,需要使用类名.静态成员名;
总结:就是说静态类中,只能用静态的字段、字段和方法,在非静态类中都可以用。在这里插入代码片
静态类比较方便调用,可以写“工具类”,但是他是占内存的。
21.构造函数
构造函数就是在进行类的实例化来创建对象的时候调用的,也就是用来初使化对象的,写法是
public 类名([参数])
{
...
}
无论写没写构造方法,默认会创建一个无参的构造方法,一但手动创建了一个构造方法,那这个默认的构造方法都会消失。
22.this关键字的两个作用
- 表示当前对象
- 在类当中显式的调用本类的构造函数(:this)
public Student(string name, int age, int grade)
{
this.Name = name;
this.Age = age;
this.grade = grade;
}
public Student(string name):this(name,0,55)//把name传给上面的Student(),没有age给传一个默认值0,grade同理
{
}
23.析构函数
释放资源
~类名
{
}
24.值类型和引用类型
- 值类型:int 、double、char、decimal、struct、enum
- 引用类型:string 、类、数组
区别:
值类型是存储在内存的栈中的。
而引用类型是存放在堆中的,比如string s=“123”,其中 “123”是放在堆中,而s是放在栈中的,s存放的内容就是“123”的地址。
25.string在内存中的存储
- string类型的数组有不可变性,就是说如果声明了一个string类型的变量,在你进行重新赋值时,他是重新开辟内存空间并重新赋值的,并不会在以前值所在的内存更改。
string s1 = "张三";
s1 = "123";
可以发现,s1地址处存储的值发生了改变,也就是说他在堆中的位置也发生了改变。
- 如果声明了两个string类型的变量,并且赋值相同,那他们会指向同一块堆空间。
可以发现他们的值是一样的。
- 我们可以讲字符串看做是char类型的一个只读数组。
ToCharArray();将字符串转换为char数组
new string(char[] chs):能够将char数组转换为字符串
26.字符串提供的各种方法
1)、Length:获得当前字符串中字符的个数
2)、ToUpper():将字符转换成大写形式
3)、ToLower():将字符串转换成小写形式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较两个字符串,可以忽略大小写
5)、Split():根据指定的分隔字符将字符串拆分为子字符串
6)、Substring():截取字符串。在截取的时候包含要截取的那个位置。
7)、IndexOf():判断某个字符串在字符串中第一次出现的位置,如果没有返回-1、值类型和引用类型在内存上存储的地方不一样。
8)、LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,如果没有同样返回-1
9)、StartsWith():判断以…开始
10)、EndsWith():判断以…结束
11)、Replace():将字符串中某个字符串替换成一个新的字符串
12)、Contains():判断某个字符串是否包含指定的字符串
13)、Trim():去掉字符串中前后的空格
14)、TrimEnd():去掉字符串中结尾的空格
15)、TrimStart():去掉字符串中前面的空格
16)、string.IsNullOrEmpty():判断一个字符串是否为空或者为null
17)、string.Join():将数组按照指定的字符串连接,返回一个字符串。
27.继承
用:表示
子类继承父类的属性和方法,子类会默认的调用父类无参数的构造函数,来创建父类对象,以供子类使用。如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,子类就调用不到了,所以子类会报错。
解决办法:
1)、在父类中重新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字:base()
28.继承的特性
1、继承的单根性:一个子类只能有一个父类。
2、继承的传递性
29.new
1)、创建对象
2)、隐藏从父类那里继承过来的同名成员。
隐藏的后果就是子类调用不到父类的成员。
30.里氏转换
- 1)、子类对象可以赋值给父类对象
- 2)、如果父类对象中装的是子类对象,那么可以把这个父类对象强转为子类对象。
子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。
31.is 和 as
- is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
- as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null
32.protected
受保护的:可以在当前类的内部以及该类的子类中访问。
33.ArrayList集合的长度问题
每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候,
集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用。
**34.Hastable 键值对集合 **
在键值对集合当中,根据键去找值的。
键值对对象 [键]=值;
键值对集合当中,键必须是唯一的,而值是可以重复的
35.3种读写文件的方式
File.ReadAllBytes();
File.WriteAllBytes();
File.ReadAllLines();
File.WriteAllLines();
File.WriteAllText();
File.WriteAllText();
Encoding.GetEncoding(“XX”).GetXXX(…);
返回一个以XX字符编码格式的XXX
36.绝对路径和相对路径
- 绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件。
- 相对路径:文件相对于应用程序的路径。
37.拆箱和装箱
- 装箱:就是将值类型转换为引用类型。
- 拆箱:将引用类型转换为值类型。
看两种类型是否发生了装箱或者拆箱,要看,这两种类型是否存在继承关系,如果存在则可能发生,如果不存在,则一定不存在关系。
如:
int a = 1;
string b=Convert.ToString(a);
这个就不是装箱,因为他们一个是存在于堆中,一个存在于栈中
38.using结构
将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源。
如:
using (FileStream stream = new FileStream(@"C:\Users\韩信\Desktop\my.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
byte[] buttf = new byte[1024 * 1024 * 5];
int a = stream.Read(buttf, 0, buttf.Length);
string s = Encoding.Default.GetString(buttf, 0, a);
Console.WriteLine(s);
}
39.常用的流
- File类(可直接通过File类来操作文件,合适小文件)
- FileStream(读写字节,通用,可读写多媒体文件)
- StreamRead(只能读文本)
- StreamWrite(只能写文本)
未完待续…