面向对象

简写重载的方法:重载中如果逻辑重复的情况下,用参数少的调用参数多
参数空缺,可以用null填补
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace m1w3d3_attribute_inherit_visit
{
#region 属性
class Student
{
public Student(string name, int age, char sex)
{
this.name = name;
this.age = age;
this.sex = sex;
}
string name;//可以读,不能写
int age;//年龄不能小于10,不能大于150
char sex;
//1、和方法大体一样,返回类型不能是void,没有参数列表
//如果你保护哪个字段,建议属性名用字段的帕斯卡命名法
//2、属性块中由两个块组成get,set
//get块在被使用(取值)时是被调用
//set块在赋值时才会被调用
//set get块可以由空语句替代
//必须全部由空语句替代,或者没有set
//get块和set块可以只有一个
//3、get块必须有返回值,值类型与属性返回类型一致
//4、在对应字段写入相应逻辑
public string Name
{
get { return " "; }//读
//set { }//写
}
public int Age
{
get { return age; }
set
{
//1、外部传入的值,在set块中用value表示
//age = value;
//if (age < 0) age = 0;
//else if (age > 150) age = 150;
if (value < ) value = ;
else if (value > ) value = ;
age = value;
}
}
}
#endregion
#region 属性的练习1
class Student1
{
public Student1(string name, char sex, int age, float cSharp, float unity)
{
this.name = name;
this.sex = sex;
this.age = age;
this.cSharp = cSharp;
this.unity = unity;
}
//public string name;
//public char sex;
//public int age;
//public float cSharp;
//public float unity;
string name;
char sex;
int age;
float cSharp;
float unity;
public void SayHello()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}生,我的CSharp成绩{3},我的Unity成绩{4}", Name, Age, Sex, CSharp, Unity);
}
//public void SaySorce(float cSharp, float unity)
//{
// Console.WriteLine("我的CSharp成绩{0},我的Unity成绩{1}", unity, cSharp);
// Console.WriteLine("我的总分是{0},我的平均分是{1}", (unity + cSharp), (unity + cSharp) / 2);
//}
public string Name
{
get { return name; }
set { }
}
public int Age
{
get
{
if (age < ) age = ;
else if (age > ) age = ;
return age;
}
set
{
age = value;
}
}
public float CSharp
{
get
{
if (cSharp <= ) cSharp = ;
else if (cSharp >= ) cSharp = ;
return cSharp;
}
set
{
cSharp = value;
}
}
public float Unity
{
get
{
return unity;
}
set
{
unity = value;
if (unity <= ) unity = ;
else if (unity >= ) unity = ; }
}
public char Sex
{
get
{
if (sex == '男' || sex == '女')
{
}
else
{
sex = '错';
}
return sex;
}
set
{ sex = value;
}
}
}
#endregion
#region 属性的练习2
class Ticket
{
float price;//写在这里,节约CPU运算
float distance;
public Ticket() { }
public Ticket(float distance)
{
//float price;//写在这里,节约内存空间
if (distance < ) distance = ;
this.distance = distance;
if (distance <= ) price = distance;
else if (distance <= ) price = distance * 0.95f;
else if (distance <= ) price = distance * 0.9f;
else price = distance * 0.8f;
}
public float Price
{
get { return price; }
set { }
}
public float Distance
{
get { return distance; }
}
//在C#中,我们可以通过重写ToString(),去修改一个对象的打印信息
//ToString()必须要返回一个字符串
//Console.WriteLine()默认是用了 格式化字符串
//我们可以通过调用 格式化字符串方法
//String.Format();
public override string ToString()
{
return String.Format("这张票的票价是{0},距离{1}", Price, Distance);
}
}
#endregion
#region 属性的简写
//get set块 可以是空语句,set块可以没有
//这样的属性我们叫做自动属性,自动属性可以帮助我们快速实现一个自动属性
//自动属性有保护的字段
class Student2
{
//public string name;//隐藏字段
public char sex;
public int age;
public float cSharp;
public float unity;
public string Name
{
get;//隐藏字段
set;
}
//public string Name => name;//只读属性的另一种写法
public void SayHello()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}生,我的CSharp成绩{3},我的Unity成绩{4}", Name, age, sex, cSharp, unity);
}
}
#endregion
#region 静态类
static class Manager
{
public static int money;
public static Random roll = new Random();
}
class Fighter
{
string name;
public Fighter(string name)
{
this.name = name;
}
int health;
public void FindMoney()
{
int num = Manager.roll.Next(, );
if (num > )
{
num -= ;
Manager.money += num;
Console.WriteLine("我是{0},我帮主人捡到了{1},我好开心!!", name, num);
}
else
{
Console.WriteLine("主人我没捡到钱,我的肉不好吃!!");
}
}
public void SayHello()
{
Console.WriteLine("主人,我是{0}", name);
}
}
#endregion
class Program
{
static void Main(string[] args)
{
#region 属性
Student xiaoMing = new Student("小明", , '男');
Console.WriteLine(xiaoMing.Name);
xiaoMing.Age = ;
Console.WriteLine(xiaoMing.Age);
#endregion
#region 属性的练习1
Student1 xiaoMing1 = new Student1("小明",'男', , , );
xiaoMing1.SayHello();
Console.WriteLine(xiaoMing1.Age);
Console.WriteLine(xiaoMing1.CSharp);
Console.WriteLine(xiaoMing1.Unity);
Console.WriteLine(xiaoMing1.Sex);
Console.WriteLine();
Student1 xiaoMing2 = new Student1("小明", '大', , , );
xiaoMing2.SayHello();
Console.WriteLine(xiaoMing2.Age);
Console.WriteLine(xiaoMing2.CSharp);
Console.WriteLine(xiaoMing2.Unity);
Console.WriteLine(xiaoMing2.Sex);
Console.WriteLine();
#endregion
#region 属性的练习2
Ticket t = new Ticket();
Console.WriteLine(t.Price);
Console.WriteLine(t);
#endregion
#region 属性的简写
Student2 xiaoMing2 = new Student2();
xiaoMing2.SayHello();
#endregion
#region 静态类
string ming = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨";
Fighter[] monsters = new Fighter[];
for (int i = ; i < monsters.Length; i++)
{
monsters[i] = new Fighter("小" + ming[Manager.roll.Next(, ming.Length)]);
}
foreach (var item in monsters)
{
item.FindMoney();
}
Console.WriteLine(Manager.money);
#endregion
}
}
}
如何判定一个对象是被使用了?
结构体,在栈里读取数据

类,在栈里读取成员,在堆里读取数据(堆相当于内存条的大小)

结构体放在结构体里面,在栈里打开

结构体放在类里面,在堆里面打开

类,引用类型,直接储存的是地址,由CSharp的垃圾回收机制释放
结构体,值类型,直接存储的是数据

字符串,是特殊的引用类型,传参数时需要加ref
数组,在栈里存的是首元素的地址

堆里存储的对象数据,没有栈里的地址来指向(直接、间接),数据就会被垃圾回收机制回收
类里引用的是对象,结构体引用的不叫对象
析构函数,类似C++

析构函数可以监视,不可调用

参照《C#公共语言运行时》
 
拓展练习:乘客随着载具移动,乘客放在数组里面
 
属性

静态类

静态类占用静态空间

静态类,在程序开始时,会一直占用空间,直到程序结束时释放

C#学习笔记(十二):构造函数、属性和静态类的更多相关文章

  1. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  2. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  3. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  4. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  5. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  6. python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性

    先介绍几个类中的应用__getattr__,__setattr__,__get__,__set__,__getattribute__,. __getattr__:当在类中找不到attribute的时候 ...

  7. JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)

    1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...

  8. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

  9. Python学习笔记十二

    HTML全称:Hyper Text Markup Language超文本标记语言 不是编程语言 HTML使用标记标签来描述网页 2.  HTML标签 开始标签,结束标签.  例如:<html&g ...

  10. Maven学习笔记(十二)-maven打包之resource配置

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011781521/article/details/79052725 一.简介 构建Maven项目的 ...

随机推荐

  1. 为什么说Java语言是平台无关的?

    适当的整理了一下: 一.平台与机器指令 无论哪种编程语言编写的应用程序都需要经过操作系统和处理器来完成程序的运行,因此这里的平台是又OS和CPU所构成的,所谓的平台无关就是指软件的运行不会因操作系统. ...

  2. 【HTML5】HTML5的自学路线

    HTML5的开发市场已越来越火爆,他已经与我们的生活息息相关,它也成为了我们生活中的一部分,比如我们在网上购物,玩手游等等,都存在html5的影子,也正是因为html5的高度影响力,吸引了许多人开始关 ...

  3. Java-idea-eclipse-快捷键【mac,win】

    Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...

  4. Java-idea-生成for循环

    itar 生成array for代码块 for (int i = 0; i < array.length; i++) { = array[i]; } itco 生成Collection迭代 fo ...

  5. Unity 脚本的执行顺序

    在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的. Awake ->OnEable-> Start -> FixedUpdate-> Update ...

  6. vue.js常用的

    <input v-model.number="age" type="number"> //自动将用户的输入值转为数值类型 <input v-m ...

  7. oj2894(贝尔曼福特模板)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2894 就因为粗心,一中午没A,题目说是2000 ...

  8. java和python中的string和int数据类型的转换

    未经允许,禁止转载!!! 在平时写代码的时候经常会用到string和int数据类型的转换 由于java和python在string和int数据类型转换的时候是不一样的 下面总结了java和python ...

  9. python绘图之seaborn 笔记

    前段时间学习了梁斌老师的数据分析(升级版)第三讲<探索性数据分析及数据可视化>,由于之前一直比较忙没有来得及总结,趁今天是周末有点闲暇时间,整理一下笔记: 什么是seaborn Seabo ...

  10. CAEAGLLayer

    CAEAGLLayer 当iOS要处理高性能图形绘制,必要时就是OpenGL.应该说它应该是最后的杀手锏,至少对于非游戏的应用来说是的.因为相比Core Animation和UIkit框架,它不可思议 ...