• 【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类型

     

  • 相关阅读:
    随便 构思 一个 计算 解析积分 的 简单 的 数学软件
    为什么要 拿 光 的 干涉条纹 宽度 变化 作为 判断 光速 变化 的 依据 ?
    相对论 的 几个问题
    设计 逻辑电路 的 开关元件 (2)
    设计 逻辑电路 的 开关元件
    用 逻辑电路 实现一个 开平方 算法
    小梦 在 民科吧 发了一个 用 四则运算 开平方 的 帖
    物理学 的 基本原理
    和 小梦 探讨 一个 经典力学 问题
    二分法 比 跨越步进法 快
  • 原文地址:https://www.cnblogs.com/zhuzhubaoya/p/12388810.html
Copyright © 2020-2023  润新知