摘要:
一、静态成员1、通过static关键字修饰,是属于类,实例成员属于对象,在这个类第一次加载的时候,这个类下面的所有静态成员会被加载。2、静态成员只被创建一次,所以静态成员只有一份,实例成员有多少个对象,就有多少份。3、类加载的时候,所有的静态成员就会被创建在“静态存储区”里面,一旦创建直到程序退出,才会被回收。注:Person p;//这样实际上就已经被加载了。4、变量需要被共享的时候,方法需要被反复调用的时候,就可以把这些成员定义为静态成员。5、在静态方法中,不能直接调用实例成员,因为静态方法被调用的时候,对象还有可能不存在。6、this/base 关键字在静态方法中不能使用,因为有可能对象 阅读全文
摘要:
一、托管代码/非托管代码C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,应用程序域是相互独立的,互不影响。托管代码:被CLR管理的代码。非托管代码:不被CLR管理的代码。分配在栈空间的变量,一旦执行完成其所在的作用域(即大括号范围)就会被CLR回收。分配在堆里面的对象,当没有任何变量引用它的时候,这个对象就被标记为“垃圾对象”(没有变量引用它),等待垃圾回收器回收。Eg:1 Person p=new Person();2 3 p=null;//p这时候没有指向任何对象空间,此时为“垃圾对象”。二、GCGC会 阅读全文
摘要:
一、结构和类的区别1、结构的级别和类一致,写在命名空间下面,可以定义字段、属性、方法、构造方法也可以通过关键字new创建对象。2、结构中的字段不能赋初始值。3、无参数的构造函数无论如何C#编译器都会自动生成,所以不能为结构定义一个无参构造函数。4、在构造函数中,必须给结构体的所有字段赋值。5、在构造函数中,为属性赋值,不认为是对字段赋值,因为属性不一定是去操作字段。6、结构是值类型,在传递结构变量的时候,会将结构对象里的每一个字段复制一份拷贝到新的结构变量的字段中。7、不能定义自动属性,因为字段属性会生成一个字段,而这个字段必须要求在构造函数中,但我们不知道这个字段叫什么名字。8、声明结构体对 阅读全文
摘要:
常量和只读变量的区别const string name="Xuj";readonly string name;1、常量是不可改变的,只读变量只能在构造方法中才能改变其值。2、C#编译器在编译的时候,声明常量的那句话不见了,在使用常量的时候就被常量的值替代了,在些数据在整个程序的运行中其值不会发生改变,我们就把这个值定义为常量,以提高程序的运行效率。3、readonly是运行时确定值,const是编译时必须确定其值。Eg:readonly string qq=System.ConfigrationManager.AppSettings[qq].ToString();//右边的 阅读全文
摘要:
一、this关键字作用1、this表示当前运行中的对象Eg:public class Person{ public int age; public string name; public Person(int age,string name) { this.age=age;//把传递进来的12赋值给当前运行在内存中的对象的age属性,下同 this.name=name; Console.WriteLine("两个参数的构造函数被调用了"); } static void Main(string[] args) { Person p=new ... 阅读全文
摘要:
一、面向对象是执行者到指挥者的转变现在要做一件事情:把大象放进冰箱。 做这样一件事的步骤就是:1、打开冰箱。2、放进大象。3、关上冰箱门。如果你是这么做的,那么这就是面向过程,它偏向于是事件的“执行者”。而面向对象,则偏向于是事件的“管理者”,它一定是先创造出一种冰箱,它具备可以开门,可以拉大象进门,可以自动关门的功能,然后调用这个冰箱去自己完成“把大象放进冰箱”这件事。你愿意去当一个执行者,还是去当一个管理者?当然是管理者,所以,编程语言的发展,一定更趋向于人的更合理的思维方式。二、类和对象“物以类聚”这句成语听过吧?类,就是具有相同特征的一类事物的统称,它是抽象的,不能直接使用。对象就是类 阅读全文
摘要:
1、out必须在方法中为其赋值,在调用的时候必须在变量的前面加上out关键字,侧重输出。2、ref修饰方法的参数,在调用的时候必须在变量的前面加上ref关键字,可以修改其值也可以不修改,侧重修改。3、out和ref只能传递变量不能传常量,传递的时候不是传递变量的值,而是传变量的地址。3、out在传递之前可以不赋初始值,因为在方法里面肯定会为out赋值,ref在传递之前必须要有值,因为在方法中有可能会用到参数的值。static void TestOut(out int i){ i=110;//out中一定要对变量赋值}static void TestRef(ref int i){ i+=1... 阅读全文
摘要:
1、参数被params修饰即为可变参数,params只能修饰一维数组。2、给可变参数赋值的时候,可以直接传递数组的元素。3、在调用的时候,会自动将这些元素封装为一个数组,并将数组传递。4、可变参数必须放在方法参数的最后。Eg:static void TestParams(params int[] arr){ //方法内容}static void TestParams(int i,int j,params int[] arr)//需放在最后{ //方法内容}static void Main(string[] args){ int arr={1,2,3,4,5,6,9}; Te... 阅读全文
摘要:
一、内存存值须知1、在内存里面开辟空间的时候,要指定空间的类型。2、内存开多大,根据这个数据类型的最大值决定。(大小由微软规定,亦称预定义数据类型)3、空间大小的不一样,数据类型不一样。二、变量须知1、变量就是开辟的那一块空间。2、变量名就是为这个空间取的别名。3、变量类型就是这个空间的数据类型。4、变量的值就是这个空间里的值。三、string 转int ,Parse和Convert 区别Convert转换内部就是调用的int.Parse方法,只不过在转换前判断字符串是否为null,如果是null则返回0,int.Parse如果为null则抛异常。四、值类型、引用类型1、值类型(数值类型、ch 阅读全文
摘要:
导语:CPU只认识二进制代码,那么C#源代码是怎样变成CPU可识别的二进制代码的呢?步骤如下:1、C#源码2、运用VS自带的命令提示窗口,使用csc命令将C#源码转成程序集(EXE文件或DLL文件),程序集里面主要由MSIL(微软中间语言)组成,通过.NET Reflector工具可以将程序集进行反编译,可以看到里面的微软中间语言。3、运行EXE文件后,.net framework也开始运行,里面的CLR(公共语言运行时)中的JIT(即时编译器)将中间语言转成本地平台的CPU指令,并将指令发给CPU执行。疑点:1、为什么程序集不直接变成二进制代码?这样看起来岂不是更快?不同品牌不同型号的CPU 阅读全文