实习要换技术栈,开始学习C#。没什么想法,大部分语法和java相通,百无聊赖,这里稍微记录一下在学习过程中遇到的问题。
1、关于对象和结构体
对象:引用变量
结构体:值变量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ch09Ex03
{
class MyClass
{
public int val;
}
struct myStruct
{
public int val;
}
class Program
{
static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
}
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
可以看出,上面的针对对象和结构体的逻辑操作是相同的,但是结果不同,这是因为对象和结构体的值的属性不同,对象是一个引用变量,当对引用变量赋值时,其实是赋值给它一个指针,值的存储位置并没有变化。而对于结构体来说,它是一个值变量,当复制给它的时候,是将另外一个结构体内的所有的值都复制了一遍,每一个结构体变量都有自己的存储空间。所以赋值以后对它的操作只涉及当前结构体本身的存储空间内的数据。
2、对于sealed修饰的类,表示当前类作了封装,不能再被继承。对于sealed修饰的方法和属性值,表示方法或者属性不能被重写。
3、几个关键字来修饰类中的成员:
public : 成员可以有任何代码来访问
private:成员只能由当前类中的代码访问(当没有关键字修饰时,默认是private的)
internal:成员可以有当前项目内的代码访问
protected:可以由当前类及其派生类中的代码访问
sealed:修饰的类表示已密封,不能被继承。修饰的方法和属性,表示不能被重写(overwrite)。密封类不能被继承,密封方法不能被重写。
4、关于拆箱和装箱
装箱的过程就是将一个值类型转换成一个引用类型,也就是说要转换成一个对象。而拆箱的过程就是将一个引用类型转换成一个值类型。装箱的过程会带来性能的损耗,这是因为:
A) 要为值类型在托管堆中分配内存,这些内存包括值类型本身的内存,也有引用指针和索引块儿带来的内存
B) 要将值类型的值复制到新分配的内存中
C) 要返回已经成为引用类型的对象的地址
5、几个独特的用法
public double? R = null; 这里在double后面加一个?表示可以为null,原来double是基本数据类型,不能赋值为空的,加了问号表示可空类型。
op1 ?? op2; 两个问好表示空接合运算符。当op1不为空时,返回op1, 否则返回op2。 这个操作等价为 op1 == null ? op2 : op1
6、delegate关键字:修饰的方法表示委托方法,也就是说当前的方法的参数可以是另一个方法,但是这两个方法的参数类型和参数个数必须一致。
7、const关键字:用const修饰的变量称之为只读变量,一般在变量定义的时候初始化,后面不能改变这个变量的值,属于编译时常量。但是这个关键字和readonly又有不同,const字段修饰的词只能在定义的时候进行初始化,readonly 则可以在声明或者构造函数中初始化,readonly属于运行时常量。
8、关于virtual和abstract的区别:virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。
A)Virtual表示虚拟的,abstract表示抽象的。virtual修饰的方法必须有实现。abstract修饰的方法必须没有实现(方法体为空)
B)virtual修饰的方法可以被子类重写,而abstract修饰的方法必须被子类重写
C)包含抽象方法的类一定是抽象类,抽象类不能直接实例化,需要被继承之后,重写抽象方法,完成方法体之后才能被实例化
9、关于构造函数和析构函数
构造函数和析构函数是类中比较特殊的两种成员函数,主要用来做对象初始化和回收对象资源。一般来说,对象的生命从构造函数开始,以析构函数终止。一个类中可以有多个重载的构造函数,但是只能有一个析构函数,并且析构函数无法调用,它是系统自动调用的。
10、var关键字的用法:
var是一个弱化类型定义的一种方式,可以替换任何数据类型,这一点和object有点像,按时不同的是它的效率比object要高。
var在使用的时候有几个注意事项,必须在定义的时候初始化,初始化完成之后就不能再改变它的类型了,同时要求var必须是局部变量。
11、using语句的用法:
using一般用在头部,调用某些空间或者是类,也可以用using完整的路径来区分两个重名的类。
而using内部语句则表示定义一个范围,当这个范围运行结束时,dispose掉其中的对象。
12、default关键字:
在泛型中,如果需要返回泛型类型的默认值,则使用default关键字。由于在泛型中,并不知道类型值是为数值类型还是引用类型,所以无法给出默认值,而用default就解决了这个问题。
一般使用 return default(T)实现。当T的值是数值类型是,返回0,是字符串类型时返回空,是引用类型时返回空,是结构化类型的时候返回的每个结构化成员都是默认值,为零或为空。