【c#.Net】类:面向对象
面向对象思想----制作仪表盘
访问修饰符,如果创建的属性字段,类,什么也不加默认为private
private字段只能在类内使用
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace test6 8 { 9 class DashBoard//仪表盘 10 { 11 public string Name;//表盘名称 12 private double Value;//当前表值,外部应该不能设置表盘读数 13 List<零件> 零件s; 14 15 public void Reset() 16 { 17 Value = 0; 18 Console.WriteLine("表盘复位完成"); 19 20 } 21 public void Rotate(double angle)//指针转动 22 { 23 Value = angle; 24 Console.WriteLine("转动了{0}度", angle); 25 } 26 27 28 public void ShowValue() 29 { 30 Console.WriteLine("当前表盘读数{0}度", Value); 31 32 } 33 } 34 class 零件 { } 35 36 //值类型,引用类型 int string list 37 class Program{ 38 static void Main(string[] args) 39 { 40 DashBoard db = new DashBoard();//仪表盘实例化,开辟一段连续的内存区域,首地址返回给db(一个实例,一个引用类型)这个引用 41 db.Name = "速度表盘"; 42 db.Reset(); 43 db.Rotate(10.0); 44 db.ShowValue(); 45 Console.Read(); 46 } 47 } 48 }
一般实例化大类时,其中的属性都是private,避免谁都可以修改里面的变量值
其中:java的一种惯用法
先定义私有变量,然后get取值,set赋值
c#的惯用法:
value是上下文关键字(上下文关键字即根据具体语境判断是不是关键字),value只有在set中才有确切的含义,不在set中可以当作一个变量去使用。
private string _Name;//表盘名称
public string Name
{
get { return _Name; }
set { _Name = value; }
}
--------为了简化get,set写法,c#再次提出了一个叫做自动属性的说法,上方代码可以简写为以下一句话即可:
private string Name{ get; set; }//表盘名称,Name仍为私有变量,但是可以get,set其值
private string Name;同private string Name{ get; set; }是由区别的
private string Name{ get; set; }更灵活,其中get,set中是可以写东西的
仪表盘名字为空,抛异常
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace test6 8 { 9 class DashBoard//仪表盘 10 { 11 private string _Name; 12 private double Value;//当前表值,外部应该不能设置表盘读数 13 private List<零件> 零件s; 14 public string Name { 15 get { return _Name; }//set打开,get也需要打开; 16 set 17 {if(string.IsNullOrEmpty(value)) 18 { 19 try 20 { 21 throw new ArgumentNullException(); 22 } 23 catch (Exception ex) 24 { 25 Console.WriteLine(ex); 26 27 } 28 29 } 30 _Name = value; 31 } 32 }//表盘名称 33 34 35 public double GetValue() 36 { 37 return this.Value;//这里的this消除歧义,指当前Dashboard的Value 38 } 39 40 public void Reset() 41 { 42 Value = 0; 43 Console.WriteLine("{0}表盘复位完成",this.Name); 44 45 } 46 public void Rotate(double angle)//指针转动 47 { 48 Value = angle; 49 Console.WriteLine("转动了{0}度", angle); 50 } 51 52 53 public void ShowValue() 54 { 55 Console.WriteLine("当前表盘读数{0}度", Value); 56 57 } 58 59 //将表盘读数存储到数据库 60 public bool Save() //将表盘读数存储到数据库 61 62 { 63 数据库 dataBase = new 数据库(); 64 return dataBase.Store(this);//this表示保存当前Dashboard实例化的各个值到数据库 65 } 66 67 } 68 class 零件 { } 69 class 数据库 70 { 71 public bool Store(DashBoard db) 72 { 73 return true; 74 } 75 } 76 //值类型,引用类型 int string list 77 class Program{ 78 static void Main(string[] args) 79 { 80 DashBoard db = new DashBoard();//仪表盘实例化,开辟一段连续的内存区域,首地址返回给db(一个实例,一个引用类型)这个引用 81 db.Name = ""; 82 db.Reset(); 83 db.Rotate(10.0); 84 db.ShowValue(); 85 Console.Read(); 86 } 87 } 88 }
定义只读只写属性
1 //外部访问权限必须比里面的大,get前是private,set前是public,所以这个是一个只读属性 2 public string Name { 3 private get { return _Name; }//set打开,get也需要打开; 4 public set 5 {if(string.IsNullOrEmpty(value)) 6 { 7 throw new ArgumentNullException(); 8 } 9 10 } 11 _Name = value; 12 } 13 }//表盘名称 14 //外部访问权限必须比里面的大,set前是private,get前是public,所以这个是一个只写属性 15 public string Name { 16 private get { return _Name; }//set打开,get也需要打开; 17 public set 18 {if(string.IsNullOrEmpty(value)) 19 { 20 throw new ArgumentNullException(); 21 } 22 23 } 24 _Name = value; 25 } 26 }//表盘名称
DashBoard db = new DashBoard();-----
其中DashBoard()就是一个构造器(也可以叫构造方法,构造函数)
构造方法不需要返回值(比较特殊)
在DashBoard类是否有中DashBoard()都不要及,如果没有,c#默认也给添加的。如果有自己在类中定义的构造方法,那么c#默认定义的原有的构造方法就不生效了。
以下例子,自己在类中的定义了自定义构造方法DashBoard(),默认在创建实例的时候就把仪表盘的名字定义好了。
重载
创建属性的时候可以初始化赋值
构造函数可以相互调用(工作中可能会用到)
对象初始化器:
DashBoard db = new DashBoard() {Name="XX" };
有很多方法只用一次,就可以定义匿名对象,没有名字。不用额外建自己的类型,直接打印一些东西很方便
对象初始化同匿名对象很像。上方对象初始化中用var是因为,c#会根据Dashboard判断类型是Dashboard,所以可以不用明确定义类型。
class--类型
字段/属性共享
static public long Sum { get; set; }//总计数,添加static就代表资源共享,实例中调用直接用Dashboard.Sum()即可调用,用实例名字调用会报错
同
public static long Sum { get; set; }
意思一致
static是指程序加载第一次的时候,类第一次做的事。
static 方法名
----static只能调用static的方法/字段/属性,无法调用动态的方法/字段/属性。
动态可以调用动态和static的方法/字段/属性
静态构造器
可以直接对static成员变量进行赋值
static 类名----无法创造静态类的实例,不够灵活,那么这个类是唯一的不可变的,内容也比较固定
const多用于常量,编译时确定数值必须确定,
readonly是运行时给值,且无法改变
分布类--partial class Dashboard----多人一起作业一个类时用到
分布方法必须在分布类中
partial方法必须是void类型