你们好,我叫李京阳,,很高兴认识你们,之因此我想开一个本身的博客,就是来把本身所了解的知识点经过本身的话写一下,但愿被博客园的朋友们点评和一块儿讨论一下,也但愿从博客园中多认识一些软件开发人员!如今我开始讲一下面向对象的一点知识,请大家多多点评和讨论!!程序员
1. 结构体与咱们以前学的类特别的类似.
2. 定义结构体的语法
struct 结构体的名字
{
}数组
1 struct Point 2 { 3 public int x; 4 public int y; 5 public Person p; 6 7 public Point(int x,int y) 8 { 9 this.y = y; 10 this.x = x; 11 p = new Person(); 12 }
3. 定义的位置:
和类同样,定义在命名空间的下面.
4. 结构体中能够定义字段、方法、属性、构造函数.
结构体的使用与类同样. 也须要建立对象 而后调用对象的成员.
1 Yuan y = new Yuan(12.56); 2 Console.WriteLine(y.GetZhouChang()); 3 Console.WriteLine(y.GetArea());
5. 结构体与类的区别:
a. 从语法上的区别.
1).类使用class关键字声明,结构体使用struct关键字声明
2).能够为结构体声明字段,可是在声明字段的同时不能为其赋默认值,由于结构体能够用结构体名 变量名的方式(Direction d1;)来声明变量,这样的话就会跳过构造函数,致使字段在使用前就没有值。为何类能够呢,其实类也不行,只是编译的时候会把赋值的执行代码写在构造函数里面去,而类只能经过new关键字来建立变量,因此必定会执行构造函数(就算没有赋值,执行构造函数也会赋默认值),因此用字段以前,必定会有值得。
3).属性与类中的属性同样,用来保护字段的,这个和类中的属性没有区别.
4).方法一样的表示1个功能,与类中的方法没有任何区别.
5).无参数的构造函数不管如何都会被C#编译器自动生成,因此不容许程序员为结构体写1个无参数的构造函数,而且反编译咱们是看不到这个无参的构造函数的,只能new的时候在括号里面看到重载的构造函数。函数
6).要求在结构体的构造函数中,必需要为当前结构体对象的每1个字段赋值.
b. 建立对象
在建立结构体对象的时候,能够像类那样使用new关键字来建立. 也能够不使用new关键字建立.
经过new关键字建立对象之后,这个对象的每1个字段就已经有值(默认值)了.那么咱们就能够直接的使用.
由于经过new关键字建立对象,调用了构造函数.而在构造函数中又必需要为每1个字段赋值.
咱们能够猜出,无参数的构造函数中作的事情: 为值类型的字段赋值0 为引用类型的字段赋值null
若是不使用new关键字来建立对象,那么这个结构体对象的字段是没有值的,要求在使用字段的值以前必须为字段赋值.
由于这种方式建立结构体对象没有调用构造函数,而在声明字段的时候又不容许赋值. 因此这样建立对象字段是没有值的.
6. 结构体与类本质上的区别
a. 结构体是1个值类型,类是引用类型this
b. 结构体的变量自己就是1个对象,其中不像类那样存储地址. 真正的结构体对象直接存储在这个结构体的变量中.
结构体对象的成员直接存在结构体变量中,
在声明结构体变量的时候, 其实就已经在结构体变量中建立好对象了.
new关键字仅仅调用构造函数.
c. 结构体相互赋值的时候,是逐个拷贝字段的值. spa
7. 何时使用结构体.
a. 栈空间比较小,可是访问速度较快; 堆空间比较大,可是访问速度较慢
b. 结构体对象是分配在栈空间中,因此结构体对象的访问速度比堆空间中的类的对象要块.
c. 当咱们要表示1个轻量级对象的时候,其中的成员较少.就能够将其声明为结构体,
这个时候访问速度较块.
重量级对象当成员比较多的时候,就声明为类,让对象分配在堆空间中.3d
1. 二维数组: 它表示1个表格数据. 有行有列.
与数组的特色同样: 全部的数据的类型相同. 存储的个数固定.
2. 建立1个二维数组呢? 二维数组的特色在于有行有列.
元素的类型[,] 数组的名称 = new 元素的类型[行数,列数];
code
1 int[, ,] arr = new int[3, 5, 4]; 2 Console.WriteLine(arr.Length); 3 arr[0, 0, 0] = 12; 4 arr[2, 4, 3] = 19;
表示声明了1个指定行数,每1行有指定列数的1个表结构.
二维数组的元素的个数: 行数列数
3. 为二维数组中的元素赋值.
二维数组中的元素必须经过行列两个坐标来肯定.肯定这个元素在第几行的第几列.
二维数组中的行列坐标从0开始.
在索引器中写上行坐标和列坐标就能够定位到指定的元素.
arr[行坐标,列坐标]=值;
4. 取值:
仍然经过行列坐标去取值.
5. 一维数组表示1条线. 肯定线上的1点只要1个坐标.
二维表示表示1个面. 肯定面上的1点要2个坐标.
6. 数组的Rank属性 能够获得数组的维度.
7. 遍历:
Length属性表明数组中元素的个数,而 二维数组中的Length指的是行列
a. 使用foreach能够简单快速的遍历.
foreach(int item in arr)
{
cw(item);
}
b. 数组的GetLength()方法能够获得指定维度的长度.
传入0 能够获得行数,
传入1 能够获得列数
for(int i=0;i<arr.GetLength(0);i++)
{
for(int j =0;j<arr.GetLength(1);j++)
{
arr[i,j];
}
}
对象
1 for (int i = 0; i < arr.GetLength(0); i++) 2 { 3 for (int j = 0; j < arr.GetLength(1); j++) 4 { 5 for (int k = 0; k < arr.GetLength(2); k++) 6 { 7 Console.WriteLine(arr[i,j,k]); 8 } 9 } 10 }
8. 当我有1个表格数据的时候.
这些数据有行有列的存储. 咱们就可使用二维数组.
9. 使用数组初始化器初始化二维数组中的每1个元素,
int[,] arr = { { 10, 20, 30 }, { 40, 50, 60 }, { 60, 70,80} };
10.三维数组.int[, ,] arr = new int[3, 5, 4];blog
1. 在类中只能定义字段、属性、方法、构造函数.
语法上容许在定义字段的同时为字段赋值.
2. 交错数组的本质是1个一维数组,只不过这个1维数组的元素的类型是1个数组.
元素的类型[][] 数组的名称 = new 元素的类型[交错数组的长度][]
在声明交错数组的时候,只须要指定1维数组的长度。
索引
1 int[][] arr = new int[4][]; 2 arr[0] = new int[4]; 3 arr[1] = new int[3]; 4 arr[2] = new int[5]; 5 arr[3] = new int[9];
3. 赋值.
给交错数组的元素赋值,必定要是1个数组,由于交错数组的元素是1个数组类型的
为交错数组的元素的元素赋值
先经过索引器肯定交错数组的元素 这个元素的类型是1个数组 再经过1个索引器肯定交错数组的元素的元素 int[][] arr = { new int[] { 1, 2, 3, }, new int[] { 4, 5, 667, 8, 9 } };
arr[0][0]=12;
4. 取值:
5. 遍历.
使用foreach遍历,由于交错数组的元素的类型是1个数组,因此迭代变量的类型也应该是1个数组.
而后再遍历这个迭代变量.
foreach (int[] item in arr)
{
foreach(int i in item)
{
cw(i);
}
}
使用for循环来遍历交错数组,
for (int i = 0; i < arr.Length; i++)
{
arr[i]是交错数的元素,这个元素是1个数组 还得遍历这个arr[i]
for(int j=0;j<arr[i].Length;j++)
{
cw(arr[i][j]);
}
}
1 foreach (int[] item in arr) 2 { 3 foreach (int i in item) 4 { 5 Console.Write(i+"\t"); 6 } 7 Console.WriteLine(); 8 }
6. 表示1个表格数据,行肯定m,可是每1个行的列数不相同. 这个时候就可使用交错数组.