C# 数据类型笔记

it2023-09-10  65

C#数据类型

double

(与float相比,多用double)

decimal

用于金融的小数类型

C#中双引号代表字符串,单引号代表字符类型

转义符:

\n换行,\t空一段,可以用于对齐文字,@在字符串定义前加@表示忽略转义。 string str1 = @“C:\111\111.txt”;=string str1 = “C:\111\111.txt”;

string , Stringbuilder , Stringbuffer

执行速度方面的比较:StringBuilder >StringBuffer > String

String一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。而StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销。当需要进行频繁修改字符串的操作时先建立StringBuffer类对象进行操作,将最后结果转化成String类对象返回,这样效率会高很多

在线程安全方面

StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全)

在操作少量变动的数据时,使用String;在单线程中操作大量数据的字符串时,使用StringBuilder;在多线程中操作大量数据的字符串时,使用StringBuffer。

数组 , arraylist , list

Array

数组在内存中是连续的,索引速度很快,赋值和修改也很简单。同时,数组也有很多缺点。数组分配在一块连续的数据空间上,因此分配空间时必须确定大小,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。空间的连续,也导致了存储效率低,插入和删除元素效率比较低,而且麻烦。

Array 定义和初始化的几种方式

1.int[] stuScore = new int[2]; stuScore[0] = 11; stuScore[1] = 12; stuScore[2] = 13; 2.int [] stuScore = new int[2]{11,12,13}; 3.int[] stuScore = new int[]{11,12,13}; 4.int[] stuScore = {11,12,13};

Array常见方法

Array.Sort(array);//对数组进行排序 Array.Reverse(array);//对数组进行反转 int maxNum = array.Max();//求数组中元素的最大值 int minNum = array.Min();//求数组中元素的最小值 if(array.Contains(20))//判断元素中是否包含40这个元素 foreach(int item in array)//遍历数组 int [] newArray = new int[array.Length]; array.CoptTo(newArray,0);//将array中的所有元素赋值给newArray,0代表从第0个元 素开始拷贝 Array.clear(newArray,0,newArray.Length);//从第0个元素开始清除

Array深拷贝浅拷贝

int[] newArray = array;//把数组array赋值给newArray,这是一个浅拷贝的问题,就是把栈中指向堆中的地址赋值给新数组,C#中的数组元素存在堆中,newArray和array指向的是同一个数组,如果改变了array中的值,newArray中的值也会改变。如果想实现真正的拷贝,深拷贝用CopyTo, array.CopyTo(newArray,0);就是把array中的值拷贝给newArray,实现深拷贝。

ArrayList

ArrayList是一个特殊数组,通过添加和删除元素就可以动态改变数组的长度。支持自动改变大小,可以灵活的插入元素,可以灵活的删除元素,可以灵活的访问元素,但是ArrayList只支持一维,并且查询和检索的速度比较慢。 object类是所有类的基类,所有的数据类型都可以转换成object类,这就是为什么ArrayList可以存储值类型和引用类型,因为在存储的时候全被转换成object类型存储这也是ArrayList的一个缺点,就是存储的时候需要把值类型封装成object类型,取出来的时候需要再把object类型再转换成值类型,这一装箱和拆箱的过程非常消耗性能。

List

List是由ArrayList发展而来的集合,同样具备了ArrayList相对于Array的优点,List是一种泛型集合,解决了ArrayList对于值类型需要拆箱和装箱的缺点,List在声明的时候需要指定存储集合的数据类型

const 和 readonly

静态常量: 是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。 动态常量: 值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化

区别

const修饰的常量是静态常量;而readonly则是动态常量。 1、const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化 2、const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候 3、const修饰的常量注重的是效率;readonly修饰的常量注重灵活 4、const修饰的常量没有内存消耗;readonly因为需要保存常量,所以有内存消耗 5、const只能修饰基元类型、枚举类、或者字符串类型;readonly却没有这个限制

const double pi = 3.1415926; static void Main(string[] args) { Console.WriteLine(pi); Console.ReadLine(); } class Person { public readonly string Name; public Person(string name) { this.Name = name; } } class Program { static void Main(string[] args) { Person person = new Person("123"); person.Name = "Leo";//错误,因为Name已经被赋值了 Console.ReadLine(); } } ```

var 和 dynamic

var

var关键字是定义数据类型的间接方式.

string str = “Test”; 这种写法被称为显式类型的声明,也被称为直接声明。

var str = “Test”; 这被称为隐式类型声明或间接类型声明。

一般情况下,编译器会在编译过程中验证数据,并在编译过程中创建适当的类型。 当你创建了一个很大的类,那么为了方便创建对象,你最好使用var关键字。还有一种约定俗成的习惯,当我们使用LINQ或Anonymous类型时,必须使用var关键字。

dynamic

dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

Ctrl+Tab在某个程序中切换不同窗口,Alt+Tab在操作系统中切换不同程序

ref & out

ref (1) public static void Swap(int a, int b) { int temp; temp = a; a = b; b = temp; } private static void Main(string[] args) { int a = 1;int b = 2; Swap(a, b); System.Console.WriteLine("a={0},b={1}",a,b); } 结果:a=1,b=2,这是值传递 (2) public static void Swap(ref int a, ref int b) { int temp; temp = a; a = b; b = temp; } private static void Main(string[] args) { int a = 1;int b = 2; Swap(ref a, ref b); System.Console.WriteLine("a={0},b={1}",a,b); } 结果:a=2,b=1,ref是通过给方法传递值类型的参数,直接操作同一个变量的关键字。 out (1) int number; Method(number); void Method(int myRefInt) { myRefInt = 66; } Console.WriteLine(number); //输出:0 (2) int number; Method(out number); void Method(out int myRefInt) { myRefInt = 66; } Console.WriteLine(number); //输出:66 ref 和 out 区别: 在使用ref传递参数的时候,ref修饰的参数必须要有值,但是out可以使用一个未赋值的变量作为参数传递

可变参数:params关键字

1、若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。

2、不允许将params修饰符与ref和out修饰符组合起来使用。

3、参数数组必须是一维数组。

4、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。

5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。 数组,则该参数数组必须位于形参列表的最后。

2、不允许将params修饰符与ref和out修饰符组合起来使用。

3、参数数组必须是一维数组。

4、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。

5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。

最新回复(0)