U3D开发学习之路--C#基础

本篇博客主要写下C#基础中一些自己认为比较重要的知识点,并没有把所有知识点写全,如有不对的地方,非常感谢批评指正。本文中标黄色的地方为重点

1、逻辑运算符

对于&&运算符,当第一个操作数为false时,将不会判断第二个操作数,对于||运算符,当地一个操作数为true时,将不会判断第二个操作数。

2、跳转语句

跳转语句主要介绍它的应用,比如continue,计算1到100能被3整除的数字累加和

int sum = 0;
for (int i=0; i<100; i++){
    if(i%3!=0)
    continue;
    sum+=i;
}

3、应用参数

使用ref关键字修饰,调用方法时复制实参变量在栈中的引用,也就是说当我修改引用的时候,其真实数据也会更改,它的作用就是修改数据。注意:ref要求实参在传递前必须先进行赋值。

4、输出参数

使用out关键字修饰,同样调用方法时复制实参变量在栈中的引用,作用是返回结果,当我们想在一个方法中返回多个结果的时候需要使用该方法。注意:out要求形参在离开方法时必须要进行赋值。

5、TryParse

我们知道Parse是转换类型的方法之一,比如一个字符串string str = "100",将其转成int类型,需要使用Int.Parse(str)方法,但是一旦str里存放的不是一个能够转换成int类型的有效数据的话就会出错。因此我们一般使用TryParse方法。方法如下:

int number;
string str = "100";
bool result = int.TryParse(str,out number);

6、排序算法

排序算法有很多,以后会一一总结出来,这里先介绍两个常用的排序算法:冒泡排序,选择排序。

冒泡排序:依次比较索引处的值与后面值的大小,如果比后面的值大,则换位,每次索引加1

public static void OrderBy(int[] array){
    for (int i=0;i
   
   
    
    array[j]){
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
}
   
   

选择排序:我们发现在冒泡排序过程当中,每一次迭代的过程中,最多的时候要对数据进行多次调换,因此我们设置一个变量表示最小索引,并且判断该索引处的数值是否比后面的数都小,如果条件成立则进行数据的调换,这大大提高了排序的效率。
public static void OrderBy(int[] array)
        {
            int min=0;
            for (int i = 0; i < array.Length - 1; i++)
            {
                min = i;
                for (int j = i + 1; j < array.Length; j++)
                    if (array[min] > array[j])
                        min = j;
                if (min != i)
                {
                    int temp = array[i];
                    array[i] = array[min];
                    array[min] = temp;
                }
            }
        }

7、数组常用方法和属性

Array.Length
Array.Clear
Array.copy
Array.CopyTo
Array.Clone
Array.IndexOf
Array.LastIndexOf
Array.Sort
Array.Reverse

8、数据类型

数据类型分为值类型和引用类型;值类型分为结构体和枚举;结构体又分为我们常用的数值类型、bool、char;引用类型分为接口和类;类又分为String、Array和委托。

9、内存分配

栈区:空间小速度快,分配的空间叫做栈帧,方法执行在栈中。
堆区:空间大,读取慢。
方法生成在栈中,所以方法生成的变量也生成在栈中。

10、字符串池

每当一个字符串生成后会进入字符串池当中,例如String str1 = "abc";字符串"abc"进入字符串池当中,再声明String str2 = "abc",str2会直接指向字符串池中的"abc",而无需再次开辟新内存空间。但是String str3 = new String(new char[]{'a'}); String str4 = new String(new char[]{'a'});这里的str3和str4则不相同。在判断两个变量的引用类型是否相同时,我们一般使用Object.ReferenceEquals(str1,str2);
当一个字符串不断在变化的时候,为了减小内存开销,一般使用StringBuilder:
StringBuilder str = new StringBuilder(10);
当存储的字符大于10的时候:1、开辟更大的空间;2、拷贝数据;3、替换引用。

11、GC

Garbage Collection垃圾回收器

12、拆装箱

装箱box:值类型隐式转换为object类型或者由此值类型实现的任何接口类型的过程。消耗较大。
拆箱unbox:从object类型到值类型或者从接口类型到实现该接口的值类型的显示转换。消耗较大,但没有装箱大。
为了减小内存的开销,我们一般避免拆装箱的操作。例如:String s1 = n.ToString();也就是说在我们输出一个不是字符串类型的值时,最好使用ToString()方法将类型转换为字符串。

13、标志枚举

[Flags]
enum 名称
{
枚举值1=1;
枚举值2=2;
枚举值3=4;
枚举值4=8;
}
如此赋值的原因是,可以对枚举值进行多选,可以使用按位或运算符来进行操作:判断包含枚举值1和枚举值2两种,则枚举值1|枚举值2。这是因为枚举值1的二进制位01,枚举值2的二进制位10,01 | 10 为 11 ,11&01->01,11&10->10,所以通过修改枚举值,利用|运算可以实现多选的方法。

14、Static

类包括:字段,属性,构造函数,方法;
也可以分为:静态成员,实例成员;
还可以分为:数据成员,方法成员。
Static一直是一个比较难懂的概念。我们知道通过类可以创建对象,通过对象可以调用方法。但是有时候我们不希望创建对象再去调用方法,这样不仅繁琐,并且占用内存。因此,使用static来修饰方法。静态方法属于类,在类加载的时候则被初始化,并且只有一份。比如我们经常在C#中使用的Console.Write()方法,Write()则是一个静态方法,我们无需创建Console对象即可调用该方法。类似于此的还有静态成员变量,静态成员变量的一个例子是,一个学生类,里面有一个构造函数,需求是每当创建一个学生对象的时候,学生的数量+1。在这里我们可以使用静态成员变量,例如public static int count = 0,每当我们调用一次构造函数的时候,count++。静态构造函数用于初始化类中的静态数据成员,不允许使用访问修饰符。最后是静态类,不能够实例化,只能包含静态成员,静态类不能被继承,但是静态方法,属性都可以被继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值