1) 所处位置不同重载在同类中重写在父子类中
2) 定义方式不同重载方法名相同参数列表不同重写方法名和参数列表都相同
3) 调用方式不同重载使用相同对象以不同参数调用重写用不同对象以相同参数调用
4) 多态时机不同重载时编译时多态重写是运行时多态
封装、继承、多态
1.继承:提高代码重用度,增强软件可维护性的重要手段,符合开闭原则。
2.封装:封装是将数据和行为相结合,通过行为约束代码修改数据的程度,增强数据的安全性,属性是C#封装实现的最好体现。
3.多态性:多态性是指同名的方法在不同环境下,自适应的反应出不同得表现,是方法动态展示的重要手段。
1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的
是堆中存放的地址。
2.值类型存取快,引用类型存取慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。
4.栈的内存是自动释放的,堆内存是.NET 中会由 GC 来自动释放。
5.值类型继承自 System.ValueType,引用类型继承自System.Object。
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
protectedinternal:protected + internal
引用类型的基类是 System.Object 值类型的基类是System.ValueType
同时,值类型也隐式继承自 System.Object
ArrayList 不带泛型数据类型丢失
List
ArrayList需要装箱拆箱 List
GC 为了避免内存溢出而产生的回收机制
避免:
1)减少 new 产生对象的次数
2)使用公用的对象(静态成员)
3)将 String 换为 StringBuilder
1.接口不是类不能实例化抽象类可以间接实例化
2.接口是完全抽象抽象类为部分抽象
3.接口可以多继承抽象类是单继承
类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
可以在加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息
反射即在运行期动态获取类、对象、方法、对象数据等的一种重要手段
主要使用的类库:System.Reflection
核心类:
1.Assembly描述了程序集
2.Type描述了类这种类型
3.ConstructorInfo描述了构造函数
4.MethodInfo描述了所有的方法
5.FieldInfo描述了类的字段
6.PropertyInfo描述类的属性
通过以上核心类可在运行时动态获取程序集中的类,并执行类构造产生类对象,动态获取对象的字段或属性值,更可以动态执行类方法和实例方法等。
.Net是一个语言平台,Mono为.Net提供集成开发环境,集成并实现了.NET的编译器、CLR 和基础类库,使得.Net既可以运行在windows也可以运行于 linux,Unix,Mac OS 等。
构造函数格式为 public+类名如果加上 static 会报错(静态构造函数不能有访问修饰符)
原因:静态构造函数不允许访问修饰符,也不接受任何参数;无论创建多少类型的对象,静态构造函数只执行一次;运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;静态构造函数执行先于任何实例级别的构造函数;显然也就无法使用 this 和 base 来调用构造函数。
如果是处理字符串的话,用 string 中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而 stringBuilder 是在原来的内存里对字符串进行修改,所以在字符串处理
方面还是建议用 stringBuilder 这样比较节约内存。但是string 类的方法和功能仍然还是比stringBuilder 类要强。
string 类由于具有不可变性(即对一个 string 对象进行任何更改时,其实都是创建另外一个 string 类的对象),所以当需要频繁的对一个 string 类对象进行更改的时候,建议使用StringBuilder类,StringBuilder 类的原理是首先在内存中开辟一定大小的内存空间,当对此 StringBuilder 类对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充,而不是重新创建一个对象,这样如果对一个字符串对象进行频繁操作的时候,不会造成过多的内存浪费,其实本质上并没有很大区别,都是用来存储和操作字符串的,唯一的区别就在于性能上。
String 主要用于公共 API,通用性好、用途广泛、读取性能高、占用内存小。
StringBuilder 主要用于拼接 String,修改性能好。
不过现在的编译器已经把 String 的 + 操作优化成 StringBuilder 了,所以一般用String 就可以了
String 是不可变的,所以天然线程同步。
StringBuilder 可变,非线程同步。
(a,b) => {};
public int CountNumber(int num)
{
if (num == 1 ||num == 2)
{
return 1;
}
else
{
returnCountNumber(num -1) + CountNumber(num-2);
}
}
public static voidBubblingSort(int[]array)
{
for (int i = 0;i < array.Length; i++)
{
for (int j =0; j
{
if (array[j]< array[j+1])
{
int temp =array[j];
array[j] =array[j+1];
array[j -+1] =temp;
}
}
}
}
List,HashTable,Dictionary,Stack,Queue
List:索引泛型容器访问速度快修改速度慢
HashTable/Dictionary:散列表格式查询效率高空间占用较大
Stack:后进先出
Queue: 先进先出
不带泛型的容器需要装箱和拆箱操作速度慢所以泛型容器效率更高数据类型更安全
简单值类型--包括整数类型、实数类型、字符类型、布尔类型
复合值类型--包括结构类型、枚举类型
接口(interface)是约束类应该具备的功能集合,约束了类应该具备的功能,使类从千变万化的具体逻辑中解脱出来,便于类的管理和扩展,同时又合理解决了类的单继承问题。
C#中的委托是约束方法集合的一个类,可以便捷的使用委托对这个方法集合进行操作。
在以下情况中使用接口:
1.无法使用继承的场合
2.完全抽象的场合
3.多人协作的场合
以上等等
在以下情况中使用委托:多用于事件处理中
非托管代码才需要这个关键字一般用在带指针操作的场合
ref修饰参数,表示进行引用传递,out修饰参数也表示进行引用传递,但传递的引用只为带回返回值 ref又进又出 out不进只出
for 循环可以通过索引依次进行遍历,foreach和Enumerator.MoveNext通过迭代的方式进行遍历。内存消耗上本质上并没有太大的区别。但是在Unity中的Update中,一般不推荐使用foreach 因为会遗留内存垃圾。
通过StringBuilder那进行append,这样可以减少内存垃圾
存在,b删除只是将它在栈中的内存删除,而A对象本身是在堆中,所以A还存在
public static int Buy(int a,int b,int c) {
return a/b + ForCap(c,a/b);
}
public static int ForCap(int c,int d) {
if (d return 0; } else { return d/c + ForCap(c,d/c + d%c); } } static void Main(string[] args) { int n =int.Parse(Console.ReadLine()); int k = int.Parse(Console.ReadLine()); Function(100,100); } static void Function(int n, int k) { int i, j = 0; bool[] a = new bool[1000]; //初始false:关灯,true:开灯 for (i = 1; i <= k; i++) //k个人 for (j = 1; j <= n; j++) //n个灯 if (j % i == 0) a[j] = !a[j]; //取反,false变true,原来开变关,关变开 for (i = 1; i<= n; i++) //最后输出a[i]的值就可以了 if (a[i]) //灯亮着 Console.WriteLine(i); } static voidMain(string[] args) { int n; n =int.Parse(Console.ReadLine()); Console.WriteLine("输入的10进制为:{0}",n); Console.Write("转换为8进制数为:"); d2o(n); } static voidd2o(int n) { if (n > 7) { d2o(n / 8); } Console.Write(n%8); } static voidMain(string[] args) { int count = 0; for (int i = 1;i < 200; i++) { //外层循环:要判断的数 for (int j = 2;j <=i; j++) { if (i % j == 0&&i!=j) { break; } if (j == i ) {//结束的条件:最后一个数还没有被整除 count++; Console.WriteLine(i); } } } Console.WriteLine(count); } public staticvoid YHSJ(){ int [][]a= newint[7][] ; a[0] = newint[1]; //a[0][0]=1; a[1] = newint[2] ; for (int i = 0;i < 7; i++) { a[i] = newint[i+1] ; a[i][0] =1; a[i][i]=1; if(i>1){//求出中间的数据 for(intj=1;j
a[i][j]=a[i-1][j-1]+a[i-1][j]; } } }3. 有一排开关,第一个人把所有的开关打开,第二个人按2的倍数的开关,第三个人按3的倍数的开关,以此类推,现在又n个开关,k个人,写函数求最后等两者的开关,输入参数n和k
4. 数制转换,将任意整数转换成8进制形式
5. 找出200以内的素数。
6. 打印杨辉三角形