标签:
public class Tree { /* * 1.0考虑一个问题; * 我们有一段代码 需要在不同的地方执行一次!!! * * * 2.0如何实现 * a--> 复制粘贴 * b-->将这段代码封装成方法 在需要的两个地方各自调用一次就好了 * * * 3.0方法 * a--->对一段代码重用的机制 * b--->在面向过程中也会称作为函数 其实方法和函数指的都是同一个东西 * * * 4.0创建方法的语法 * 访问修饰符 方法返回值 方法名称([参数列表]) * { * 方法体 * } * * 关于方法的定义 * a. 定义方法的位置:直接定义在类的下面. * b. 访问修饰符有5种. public是其中的一种. 所以这个地方不用关心什么意思,直接写上public * c. static关键字. * 我们自己定义的方法 如果需要在1个被static修饰的方法中调用. * 那么我们定义的方法必须要加上static才可以被调用. * d. 方法的返回值 * e. 方法的名称: * 1). 方法的名字要取的有意义. 让别人看到名字就知道方法的内部代码在做什么事情. * 2). 方法中的代码是在完成1个功能,所以方法的名称要求使用1个动词. * 3). 方法的名称每1个单词的首字母大写. * f. 特别强调,小括弧后面没有分号. * * 5. 关于方法的调用 * 完整的调用方式: 类名.方法名()---->静态方法调用方式, new 类名().方法名()---->非静态方法调用 方法中加了static叫做静态方法; * 如果调用的方法的地方和定义方法在同1个类中: 方法名(); * */ /// <summary> /// public:--->公共的 /// static:表示该方法是一个静态方法 /// void:方式该方法没有返回值 /// Getnum():此方法的方法名,由于括号中是空的 表示此方法是一个无参数的方法 /// </summary> public static void GetnumOne() { //方法体 } /* * 访问修饰符 public private protected * */ /// <summary> /// 没有访问修饰符 那么就是默认的private: 表示该方法是私有的 /// int:该方法最终会返回一个int类型的值 /// GetNumTwo(string str) 表示传入的参数是一个string类型的 /// return :表示返回数据 /// </summary> /// <param name="str"></param> /// <returns></returns> static int GetNumTwo(string str) { if (string.IsNullOrEmpty(str)) { return 0; } else { return 1; } } public string GetNum() { return "测试"; } //------------------------------局部变量和成员变量-------------------------------------- /* 1. 局部变量: 定义在方法中的变量. * 成员变量: 直接定义在类下面的变量. * * * 2. 局部变量与成员变量的区别: * a. 作用域不同: * 局部变量只能在方法中访问. * 成员变量可以本类的所有方法中访问. * * 成员变量如果希望在被static修饰的方法中访问. * 那么这个成员变量也需要被staic修饰. * * b. 默认值不同 * 局部变量在声明的时候如果没有为其赋值 那么这个局部变量是没有值的. * 所以在使用之前必须要保证这个变量中有值 * * 成员变量在声明的时候如果没有为其赋值 那么这个成员变量是有默认值的. * 如果成员变量的类型是值类型的 那么默认值是0 * 如果成员变量的类型是引用类型的 那么默认值是null * * * * */ public string Name; //想这种定义在类(class关键字)下的 叫做成员变量 public void TestDemo() { int num = 1; //这种定义在方法中的变量叫做局部变量 //只是在这个方法中有效 } //------------------------------------------以下部分是属性介绍---------------------------------------- /* 1. 为什么要保护字段? * 因为我们希望在为字段赋值或者取值的时候做1个逻辑验证. * * 2. 微软提供了一种更为简洁的语法来保护字段---属性. * 属性的作用: 保护字段. * * 3. 如何使用属性来保护字段呢? * a. 被保护的字段一定要私有化. * b. 为这个字段写1个属性 * 语法: * 访问修饰符 属性的类型 属性的名称 * { * get * { * } * set * { * } * } * * 4. 外部如何操作属性. * a. 图标为扳手的就代表属性. * b. 外部操作的时候将属性当做字段来操作,使用赋值符号直接赋值或者直接写上属性的名称取值. * * 5. 属性到底是如何来保护字段的 * a. 为属性赋值的时候,会调用属性中的set代码块. 在set中可以通过关键字value拿到用户为属性赋的值 * 一般情况下,我们在set代码块中 取出用户为属性赋的值(value) 做逻辑验证. * 如果符合逻辑 就将用户赋的值赋值给被保护的字段. * 否则做默认处理. * * b. 当我们取属性的值的时候,就会执行属性中的get代码块的内容. * 最终取到的值,是在get块中return回去的值. * 一般情况下,我们在get代码块中 将属性保护的字段的值返回. * * 6. 写属性的时候要注意如下几点 * a、 访问修饰符. 其实任意都可以写, 因为属性是用来被外部访问的. * 所以绝大多数情况下,属性的访问修饰符应该是public * b、 属性的类型不能是void。 属性的类型一般情况下和被保护的字段的类型一致. * c. 属性的名称: 每个单词的首字母大写. * 属性的名称任意取,但是建议和被保护的字段的名称保持一致(做大小写区分) 方便代码的阅读 * d. 为属性赋值的时候,数据的类型要和属性的类型保持一致, 与被保护的字段的类型无关. * 当然绝大多数情况下,属性的类型和被保护的字段的类型一致. * e. set块中的value的类型 由 属性的类型 决定. * f. get代码快必须要在结束之前返回个数据. 返回的数据的类型由属性的类型决定. * g. 属性中只能包含get块和set块,其他的代码不能直接写在属性之中. * * 7. 注意 * a. 一定是先有字段,再用属性来保护它. * b. 在get和set中操作的是字段.而不是操作属性. 如果操作属性的话就会发生死循环, * c. 属性的类型绝大多数情况下和被保护的字段一致, * 如果希望外界得到字段的值 的类型 不要和字段的类型一致 那么就可以不一致. * bool类型的gender 希望得到1个string类型的"男‘女 * d. 1个字段对应1个属性. 不要多个字段对应1个属性这样很不好操作. * e. 在set块中,我们是判断value是否符合逻辑,而不是判断字段. * * f. 在类的内部.取值的时候,是取属性的值呢还是取字段的值呢? * 1) 如果属性取值的时候 没有做任何逻辑验证. 直接返回字段的值 * 那么这个时候,取属性的值和取字段的值是没有分别的,因为取出来的值都是一样的. * 但是建议你取字段的值,因为这样效率更高. * 2) 如果属性取值的时候,有做逻辑验证.那么这个时候取属性的值和取字段的值 取到的就不一样了. * 那么根据你的具体情况来决定,看你希望得到什么值. * * 赋值的时候. 如果属性在赋值的时候经过了逻辑处理.那么这个时候赋值 给字段赋值和给属性赋值的效果不一样. * 如果你希望你的值是很特殊 不需要经过验证 那么直接赋值给字段 * 如果你希望你的值也要验证 那么就赋值给属性. * * 8. 属性的本质是1个get方法和1个set方法. * 只不过微软提供了1种更为简洁的方式来帮助写这两个方法 * 我们之所以可以再set里面通过value关键字取到用户赋的值 是因为set本质是1个方法 这个方法的参数叫做value * * * 9. 为字段快速封装属性的快捷键: ctrl+r+e * * 10.C#关于属性的规范: * 只要字段需要被外界访问.无论在取值或者赋值的时候是否有逻辑验证,都应该为这个字段封装属性. * * * 11. 只写属性 * 属性中只有set块而没有get块. 那么只能为这个属性赋值. 而不能取这个属性的值. * 只读属性 * 属性中只有get块而没有set块, 那么只能取这个属性的值 而不能为这个属性赋值. * * 属性中至少要有1个访问器.. * * 12. 我们将值赋值给了属性,会以为将值存储在了属性之中. * 不是这样的 * 属性是不能存储数据的. 我们给属性赋值 然后属性的set块将值存储到字段中. * * 在C#中只有变量才可以存储数据. * * 12. 自动属性 * 如果属性对某个字段的封装可读并且可写. 并且在读写的时候没有任何的逻辑验证. * 那么这个时候,我们就可以不写字段,而直接写1个自动属性. * * 当我们写1个自动属, C#编译器在编译的时候,会自动的生产1个字段. * 然后这个字段被自动属性所封装. * * 什么时候才可以写1个自动属性: * a. 可读并且可写. * b. 读写的时候没有任何逻辑验证 * */ public double weight; public double Weight { get; set; } private int age; public int Age { get { return this.age; } set { this.age = value >= 0 && value <= 120 ? value : 18; } } }
下面是用的控制台程序 做的演示demo
class Program { static void Main(string[] args) { //调用静态方法 Tree.GetnumOne(); Tree tree = new Tree(); Console.WriteLine(tree.GetNum()); //打印出tree.GetNum()的返回值 tree.GetNum() 是一个实例方法 所以要先创建Tree的实例 //使用属性 Console.WriteLine(tree.Age);//打印出 Age属性的值 Console.ReadKey(); } }
标签:
原文地址:http://www.cnblogs.com/soaeon/p/5436100.html