1、什么是类?
- 包含了数据成员和函数成员。
- 数据成员是包含类的数据-字段、常量和事件的成员;
- 函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器、运算符以及索引器。
- 包含了嵌套的类型(如其他类)。
2、ref参数作用
- 方法对变量所做的任何改变都会影响原始对象的值。(一般在值传递中使用)
- 方法的声明及调用都需要ref关键字
void swap(ref int x, ref int y); //声明 //调用 int x = 5; int y = 6; sawp(ref x, ref y);
3、out参数作用
- 传递该方法的变量不需要初始化,
- 在调用该方法时,还需要使用out关键字。
4、命名参数定义
- 参数一般需要按定义的顺序传递给方法。
- 命名参数允许按任意顺序传递。
string FullName(string firstName, string lastName) { return firstName + " " + lastName; } //下面的方法调用会返回相同的全名 FullName("a", "b"); FullName(lastName:"b", firstName:"a");
5、可选参数的定义
- 可选参数必须提供默认值。
- 可选参数还必须是方法定义的最后参数。
void Test(int notOption, int option = 10) { }
6、方法重载的定义
不同的签名(方法名相同,但参数的个数或类型不同)
- 注意:在参数方面有些限制
- 两个方法不能仅在返回类型上有区别
- 两个方法不能根据参数是声明为ref还是out来区分
7、属性的访问修饰符
- c#允许给属性的get和set访问器设置不同的访问修饰符,但是必须有一个具备属性的访问级别
- 如果访问器没有任何修饰符,就表示该访问器具有属性的访问级别
8、只读字段readonly
- 变量的值不应改变,但在运行之前其值是未知的,此时就使用readonly关键字。
- 只读字段必须在构造函数中初始化。
9、什么是结构?
- 结构是用struct关键字声明的,
- 结构是值类型,他们存储在栈中或者存储为内联(inline),其生存期的限制与简单的数据类型一样。
注意:
- 结构不支持继承;
- 构造函数的工作方式有一些区别,编译器总是提供一个无参数的默认构造函数,是不允许替换的;
- 可以指定字段如何在内存中布局
struct Dimensions { public double Length; public double Width; }
10、结构的初始化方式
1、使用new运算符
- 结构是值类型,new运算符与类和其他引用类型的工作方式不同。
- new运算符并不分配堆中的内存,而是只调用相应的构造函数,根据传送给他的参数,初始化所有字段
Dimensions point = new Dimensions(); point.Length = 3; point.Width = 6;
2、直接初始化
- 声明变量,实际上是为整个结构在栈中分配空间,然后进行赋值
Dimensions point; point.Length = 3; point.Width = 6;
11、结构有什么优缺点?
结构是会影响性能的值类型。
- 正面影响:
- 为结构分配内存时,速度非常快,因为它们将内联或者保存在栈中。
- 在结构超出了作用域被删除时,速度也很快,不需要等待垃圾回收。
- 负面影响:
- 将结构作为一个参数来传递或者将一个结构赋予给另一个结构的时候,复制了结构的所有内容,而对于类只复制引用。
- 为了减少性能损失,当把结构作为参数的时候,应把它作为ref参数传递,这样只传递了结构在内存中的地址,但必须注意,被调用的方法就可以改变结构的值。
12、强引用是什么?
- 在程序代码内实例化一个类或结构时,只要代码引用它,就会形成强引用。
- 使用强引用,意味着垃圾回收器不会清理使用的内存。
13、弱引用是什么?
- 弱引用允许创建和使用对象,但是垃圾回收器运行时,就会回收对象并释放内存。
- 创建:使用WeakReference类创建的,因为该对象可能在任意时刻被回收,所以在引用该对象前必须确认它存在。
Dog test; //Dog是一个类 WeakReference testReference = new WeakReference(new Dog()); if (testReference.IsAlive) //判断弱引用是否存在 { test = testReference.Target as Dog; //Target属性返回的是Object类型,必须强制转化为Dog类型 test.Name = "Happy"; WriteLine(test.Name); } else { WriteLine("The reference is not available"); }
14、什么是部分类?
- 部分类使用partial关键字,用法:把partial放在class、struct或interface关键字的前面。
- partial关键字允许把类、结构、方法或接口放在多个文件中。
- 把部分类编译到类型中时,属性、XML注释、接口、泛型类型的参数属性和成员会合并。
//编译这两个源文件项目时,会创建一个Cat类,它有两个方法MethodOne()和MethodTwo() //Cat1.cs partial class Cat { public void MethodOne() {} } //Cat2.cs partial class Cat { public void MethodTwo() {} }
15、静态类
- 定义:只包含静态方法和属性,该类就是静态的。
- 表示方式:使用static关键字,静态类不能创建实例,访问方式是:”类名.方法名”
16、Object类
- 所有的.NET类都派生于System.Object。
- 对于结构,这个派生是间接的,结构总派生于System.ValueType,而System.ValueType又派生于System.Object。
17、System.Object()方法有哪些
- ToString():获取对象的字符串表示方式;
- GetHashCode():如果对象放在名为映射(也称为散列表或字典)的数据结构中,就可以使用;
- Equals()和ReferenceEquals():比较对象相等性;
- Finalize():接近C++的析构函数,在引用对象作为垃圾被回收以清理资源时调用它;
- GetType():获取对象成员所属类的更多信息,包括基本类型、方法、属性等;
- MemberwiseClone():复制对象,并返回对副本的一个引用。
18、扩展方法(待学习)
扩展方法是静态方法。对于扩展方法,第一个参数是要扩展的类型,放在this关键字后面