变量作用域
变量名:变量名就像实验室中容器的编号。{} 相当于实验室。
变量的定义:
有嵌套关系的{}语句块中只允许定义唯一的变量。
没有嵌套关系的{}语句块可以定义同名变量。
变量的有效范围:
变量在其声明的{}和它的嵌套子块{}有效;
变量的使用技巧:
变量尽量在用之前最近的位置声明。尽量减少有效范围。
从逻辑上讲 for (int i = 0; i < 5; i++) { } if(){}else {} while(){ } 是一个整体
相当于 {for (int i = 0; i < 5; i++) { }} { if(){}else {} } {while(){ }}
基本概念
类是:具有相同属性和行为对象的抽象
属性值:在面向对象编程里,字段作为保存属性值的变量。字段声明时可以不赋值,会有默认的值。
属性:使用特殊的“行为”来表现,一对get/set行为用来展现对象的属性。get/set称为属性的“访问器”,
方法:方法就是类能够执行的动作。函数中定义的成员使用前必须赋值。
面向对象的三个特性:封装、继承、多态。
类中只能定义字段、方法等不能包含其他代码。
this:表示“当前实例/当前对象”,即哪一个对象正在操作属性访问器,this就表示哪个对象。
访问权限/访问权限
控制类或类成员在哪些地方可以被访问,这样达到面向对象中“封装”的目的。
类成员默认为private
public 公开 对访问成员没有级别限制
private 私有 只能在类的内部访问
protected 受保护的 只能由该类和该类的派生类访问,不管该派生类和基类是否在同一程序集中
internal 内部的 访问仅限于程序集中
类默认是internal
public 公开 对访问成员没有级别限制
internal 内部的 访问仅限于程序集中
Person p1 = new Person();
p1.Age =20;//修p1所指向对象的Age字段值
Person p2 = p1;//p2指向p1当前指向的对象
p2.Age = 99;
属性 习惯用法:属性开头字母大写,字段开头字母小写
字段设为private的原因。防止直接对字段非法进行读取或修改操作。
private int age;
//当进行读取或修改操作时,确定不需要对操作进行限制时可以简写
public int Age { get; set; }
//当进行读取或修改操作时,需要对读取或修改操作进行限制时
public int Age{ get { return age; } set { age = value; } }
反编译:
public void set_Age(int value) {
this.age = value;
}
public int get_Age() {
return this.age;
}
备注:非简写的情况下:可以只用set或者只用get就可以定义只读或者只写属性。
简写情况下:set和get必须同时存在。
构造函数:
构造函数中对对象进行初始化。是用来创建对象的特殊函数,函数名和类名一样,没有返回值,连void都不用。
构造函数可以有参数,new对象的时候传递函数参数即可。可以重载,也就是有多个参数不同的构造函数。
如果不指定构造函数,则类有一个默认的无参构造函数。如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写。
构造函数的调用顺序(父子)
常量
在类中定义的常量,对于类的任何实例都不变。没有必要通过类的实例去调用。
class Program { public const double PI = 3.15; }
引用:在类外部,Program.PI; 类名.常量名 的形式引用
const常量。常量名所有字母全大写。一定不会变化的值才能声明为常量。
静态成员
也可以理解为全局成员。如:中国人类 有成员 name,language 。name会因为不同的人而有不同的值。而language仅与中国人类有关。因为所有人都是汉语。
在类外部引用:类名.变量名 类名.方法名()
int a = Person.age; Person.SetName();
class Person{
//静态成员不与类的任何实例相关联。对于类只有这一份。起到全局的作用。
public string name = "王菲";
public static int age = 15;
//在类内部的静态方法中,不能调用非静态变量和方法。
public static void SetName() {
//string s = name;
//SetAge();
}
//在类内部的非静态方法中,可以调用静态变量和方法。
public void SetAge() {
int i = age;
SetName();
}
}