C#类类型
一、类和对象
假设我开了一家烤鱼店,每当客人来点餐时,我就会用笔和纸记录这笔订单,并计算出每单的价格。以下是记录的订单:
单号:00001
种类:清江鱼
口味:香辣
配菜:豆腐
价格:140元
------------
单号:00002
种类:江团
口味:蒜香
配菜:海带
价格:180元
上面所有的内容都需要手写,当客人多的时候很浪费时间,于是我就去打印店按照以下模板打印点餐单(即纸质订单):
单号:
种类:
口味:
配菜:
价格:
这样每位客人点餐时,我就只需要写下客人点餐的内容即可。
在上面的例子中,我记录的每一笔订单都可以看作一个对象,这每一笔订单都有对应的值使之与其他订单不同,但是所有订单都具有相同的属性和行为,通过抽象出这些属性和行为得到点餐单,所以点餐单可以看作订单的类,反之对点餐单填充不同的值,可以得到不同的订单,也就是不同的对象。通过对上面的理解给类和对象下定义,类是具有相同状态和行为的一类事物,对象是一个客观存在且独一无二的个体。类和对象的关系:类是对对象的抽象,对象是对类的填充或实例化。
类的基本结构:访问修饰符 class 类名{ },其中大括号里可以是类型成员(常量、字段、属性、构造函数、方法、事件等)中的一种或多种构成。
对象的基本结构是类的实例化:类名 变量名 = new 类名();,其中变量名也叫对象。
下面我们根据上面的例子设计对应的类,并实现相应的对象。(为使代码简单,访问修饰符均用public)
/// <summary>
/// 拥有单号、种类、口味、配菜、价格和计算价格行为的订单类
/// </summary>
public class Order
{
#region 字段
/// <summary>
/// 单号(单号为自增字段,无需赋值,自增代码省略)
/// </summary>
public int orderNo; /// <summary>
/// 种类
/// </summary>
public string type; /// <summary>
/// 口味
/// </summary>
public string flavor; /// <summary>
/// 配菜
/// </summary>
public string garnish; /// <summary>
/// 价格
/// </summary>
public decimal price;
#endregion #region 方法
/// <summary>
/// 计算价格
/// </summary>
/// <param name="type">鱼的种类</param>
/// <param name="garnish">配菜种类</param>
public void CalculateThePrice(string type, string garnish)
{
//通过鱼的种类和配菜种类计算价格,过程省略
}
#endregion
}
/// <summary>
/// 实现对象的类
/// </summary>
public class RealizeObject
{
#region 方法
/// <summary>
/// 实现
/// </summary>
public void Realize()
{
//清江鱼香辣味加豆腐配菜需要140元的订单对象
Order order = new Order();
order.type = "清江鱼";
order.flavor = "香辣";
order.garnish = "豆腐";
order.price = ;//直接赋予价格
order.CalculateThePrice("清江鱼", "豆腐");//通过行为计算价格 //江团酱香味加海带配菜需要180元的订单对象
Order orderTwo = new Order();
orderTwo.type = "江团";
orderTwo.flavor = "酱香";
orderTwo.garnish = "海带";
orderTwo.price = ;//直接赋予价格
orderTwo.CalculateThePrice("江团", "海带");//通过行为计算价格
}
#endregion
}
详解类的实例化过程:Order order = new Order();等号前半部分定义一个类型为Order的变量order,这个变量的值为null;当加上等号后半部分时,才给order变量赋值,并且Order的构造函数会为order的所有字段赋默认值。用点餐单的例子讲当没有等号后半部分时,我想把一张白纸order用作点餐单,但我还没有去打印,当加上等号后半部分后,order这张白纸被我打印成了点餐单,并且我可能在打印完后立马填充对应的值。
二、类和对象相关语法
1、对象初始化语法:使用默认构造函数创建对象并设置对象数据值的简写形式。代码如下:
 public class Garnish { }
 public class Order
 {
     /// <summary>
     /// 种类
     /// </summary>
     public string Type { get; set; }
     /// <summary>
     /// 口味
     /// </summary>
     public string Flavor { get; set; }
     /// <summary>
     /// 配菜
     /// </summary>
     public string Garnish { get; set; }
     /// <summary>
     /// 价格
     /// </summary>
     public decimal Price { get; set; }
     /// <summary>
     /// 其他配菜
     /// </summary>
     public Garnish OtherGarnish { get; set; }
     public Order() { }
     public Order(string type, string flavor, string garnish)
     {
         Type = type;
         Flavor = flavor;
         Garnish = garnish;
     }
 }
 public class RealizeObject
 {
     public void Realize()
     {
         //清江鱼香辣味加豆腐配菜需要140元的订单对象
         //传统方式如下:
         Order order = new Order();
         order.Type = "清江鱼";
         order.Flavor = "香辣";
         order.Garnish = "豆腐";
         order.Price = ;//直接赋予价格
         //对象初始化语法如下:
         Order order = new Order//也可以加上(),显式调用默认构造函数
         {
             Type = "清江鱼",
             Flavor = "香辣",
             Garnish = "豆腐",
             Price =
         };
         //江团酱香味加海带配菜需要180元的订单对象
         //传统方式如下:
         Order orderTwo = new Order("江团", "酱香", "海带");
         orderTwo.Price = ;//直接赋予价格
         //调用自定义构造函数的对象初始化语法如下:
         Order orderTwo = new Order("江团", "酱香", "海带")
         {
             Price =
         };
         //在Order类中包含其他类型的属性时,对象初始化语法也可以嵌套使用
         Order orderThree = new Order
         {
             OtherGarnish = new Garnish { }
         };
     }
 }
2、部分类型:当一个类的代码过长时,可以通过partial关键字把这个类分割成两个甚至更多(物理文件分割成多个,逻辑上还是一个),一般会把不变的部分和可变的部分分割开来。
/// <summary>
/// 不变的部分
/// </summary>
public partial class Order
{
//字段 //构造函数
}
/// <summary>
/// 可变的部分
/// </summary>
public partial class Order
{
//属性 //方法
}
注:定义分部类的唯一要求是类型名称必须相同,并且必须定义在相同的命名空间中。
C#类类型的更多相关文章
- C++primer读书笔记9-转换和类类型
		有时指定自己的类类型来表示某些类型的数据,如SmallInt,然后在为了便于计算将指定一个转换算,类类型,在某些情况下,自己主动转换为指定的类型 <1>转换操作符 operator typ ... 
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
		重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ... 
- Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”
		子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ... 
- typescript可索引接口 类类型接口
		/* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据, ... 
- java反射三种获得类类型的方法
		public class Test { public static void main(String[] args) { Test t=new Test();//所有的类都是Class类的实例(类类型 ... 
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
		1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ... 
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
		0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ... 
- 在OnActionExecuted 获取请求参数的值(包含类类型)
		1.在OnActionExecuting里 获取请求参数的值 比较简单 /// <summary> /// 获取首参数的值 /// </summary> /// <par ... 
- OpenCv中基本数据类型--Point,Size,Rect,Scalar,Vec3b类类型的详细解释
		头文件路径:opencv-2.4.9/modules/core/include/opencv2/core/core.hpp 一.Point类 在这些数据类型中,最简单的就是Point点类,Point类 ... 
- Java中Class Type 类类型是怎么回事?
		Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ... 
随机推荐
- redis里能不能针对set数据的每个member设置过期时间
			不能.可以用sorted set,把要过期的member和key的信息放在sorted set的member里,把过期时间放在score中.跑个任务用zrangebyscore遍历就行了.用sorte ... 
- 安装ubuntu 16.04版本时搭建环境参考的文章
			重新编译的命令:make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok 解决ubuntu中vi不能正常使用方向键与退格键的 ... 
- [Web]   How to Test React and MobX with Jest
			转载自: https://semaphoreci.com/community/tutorials/how-to-test-react-and-mobx-with-jest?utm_content=bu ... 
- IntelliJ IDEA 运行你的第一个Java应用程序 idea运行main方法
			IntelliJ IDEA 运行你的第一个Java应用程序创建项目让我们创建一个简单的Java Hello World项目. 单击创建新的项目. 打开新建项目向导.你应该注意的主要是项目的SDK.SD ... 
- zookeeper生产最广泛使用java客户端curator介绍及其它客户端比较
			关于zookeeper的原理解析,可以参见zookeeper核心原理详解,本文所述大多数实践基于对zookeeper原理的首先理解. Curator是Netflix公司开源的一个Zookeeper客户 ... 
- JAXB xml序列化应注意
			使用JAXB将对象序列化为XML时,发现有一个地方性能非常低,即 JAXBContext.newInstance(XXX.class); 建议将其提前创建好并作为变量保存,到时可直接使用其引用,而非重 ... 
- CRM 负责人 选择
			CRM 负责人 参与 - 搜狗搜索https://www.sogou.com/sgo?query=CRM+%E8%B4%9F%E8%B4%A3%E4%BA%BA+%E5%8F%82%E4%B8%8E& ... 
- tensorflow keras analysis
			目录 Q: where is Sequential defined? Q: where is compile()? tensorflow keras analysis code from keras. ... 
- Google软件测试之道笔记与总结
			[本文出自天外归云的博客园] 以下内容除了笔记还有总结,有个人理解的成分在内. 第一章笔记与总结 1. 开发人员也承担了质量的重任,质量从来就不仅仅是一些测试人员的问题.头衔有测试字样的人的任务是让那 ... 
- 解决Invalid Plugin  needs a valid package.json
			首先.npm install -g plugman 然后,plugman create --name [插件名字] --plugin_id [插件id] 这样会生成一个除了pa ... 
