C#学习笔记(十六):索引器和重载运算符
二维数组如何映射到一维数组

- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace m1w4d2_indexes
- {
- #region 索引器-李索
- //索引器可以让我们通过不同的索引号返回对应类型的多个属性
- //索引器适用于除自动属性以外的所有属性特性
- //索引号可以是任意类型
- //索引器在通过类对象来访问和赋值 变量(类对象)[索引号]
- //访问修饰 返回类型 this[索引号,索引号,索引号,索引号......]
- //{ get {return} set {value} }
- //用索引器访问一个怪物类中的不同字段
- class Monster
- {
- public Monster(int attack, int defend, int health, int speed, string name)
- {
- this.attack = attack;
- this.defend = defend;
- this.health = health;
- this.speed = speed;
- this.name = name;
- }
- int attack;
- int defend;
- int health;
- int speed;
- string name;
- //public string this[int indexa, int indexb]
- //{
- // get { return ""; }
- // set { }
- //}
- public string this[int index]
- {
- get
- {
- string str = "";
- switch (index)
- {
- case : str = attack.ToString(); break;
- case : str = defend.ToString(); break;
- case : str = health.ToString(); break;
- case : str = speed.ToString(); break;
- case : str = name; break;
- }
- return str;
- }
- set
- {
- switch (index)
- {
- case : attack = int.Parse(value); break;
- case : defend = int.Parse(value); break;
- case : health = int.Parse(value); break;
- case : speed = int.Parse(value); break;
- case : name = value; break;
- }
- }
- }
- }
- #endregion
- #region 多维度的索引号
- //索引号可以任意维度
- //用一个MyArray类去模拟一个二维数组
- class MyArray
- {
- public MyArray(int x, int y)
- {
- //这个放元素的一维数组多长
- //array = new int[10];
- array = new int[x * y];//一维数组的长度
- Length = new int[];
- Length[] = x;
- Length[] = y;
- }
- int[] Length;
- int[] array;
- public int GetLength(int index)
- {
- if (index > Length.Length)
- {
- throw new IndexOutOfRangeException();//抛异常
- }
- return Length[index];
- }
- public int this[int x, int y]
- {
- get
- {
- //我给你一个二维的下标,你如何映射到一维数组上
- return array[x + y * GetLength()];
- }
- set
- {
- array[x + y * GetLength()] = value;
- }
- }
- }
- #endregion
- #region 索引器-沈军
- class Unity1803
- {
- // C# 单例模式 (单独的实例)
- private static Unity1803 instance = null;
- public static Unity1803 Instance
- {
- get
- {
- if (instance == null) instance = new Unity1803();
- return instance;
- }
- }
- //静态构造函数什么时候调用
- //当我们访问静态成员的时候,先调用且只调用一次
- //当我们创建对象的时候,先调用且只调用一次
- //可以对静态字段做初始化使用的,静态的成员才会加载到内存中
- //static Unity1803()//静态构造函数,不能有访问修饰符和参数
- //{
- // Console.WriteLine("调用静态构造函数");
- //}
- public int Count { private set; get; } //
- Student[] students = new Student[]; // null
- private Unity1803()
- {
- students[] = new Student("蔡浩", , );
- Count++;
- students[] = new Student("江灿荣", , );
- Count++;
- students[] = new Student("贺益民", , );
- Count++;
- }
- public Student this[int index]
- {
- get
- {
- return students[index];
- }
- set
- {
- if (students[index] == null) Count++;
- students[index] = value;
- }
- }
- public Student this[string name]
- {
- get
- {
- for (int i = ; i < Count; i++)
- {
- if (students[i].Name == name)
- {
- return students[i];
- }
- }
- return null;
- }
- set
- {
- students[Count] = new Student(name, , );
- }
- }
- }
- class Student
- {
- public string Name { get; set; }
- public int Age { get; set; }
- public int CSharpScore { get; set; }
- public Student(string name, int age, int score)
- {
- this.Name = name;
- this.Age = age;
- this.CSharpScore = score;
- }
- public override string ToString()
- {
- return "Name:" + Name + ", Age :" + Age + ", Score :" + CSharpScore;
- }
- public static bool operator >(Student lfs, int score)
- {
- return lfs.CSharpScore > score;
- }
- public static bool operator <(Student lfs, int score)
- {
- return lfs.CSharpScore < score;
- }
- public static bool operator true(Student s)
- {
- return s.CSharpScore >= ;
- }
- public static bool operator false(Student s)
- {
- return s.CSharpScore < ;
- }
- // 隐式类型转换 把字符串隐式的转换成Student类型
- public static implicit operator Student(string name)
- {
- Student s = new Student(name, , );
- return s;
- }
- // 显式类型转换 把Student类型强转成字符串
- public static explicit operator string(Student s)
- {
- return s.Name;
- }
- }
- #endregion
- class Program
- {
- static void Main(string[] args)
- {
- #region 索引器-李索
- Monster monster = new Monster(, , , , "哥布林");
- for (int i = ; i < ; i++)
- {
- Console.WriteLine(monster[i]);
- }
- Console.WriteLine();
- //把一个策划文档的数据切割成对应的字符数组
- //序列化
- string dataTitle = "attack,defend,health,speed,name";
- string data = "100,15,500,1,蠕虫皇后";
- string[] datas = data.Split(',');
- for (int i = ; i < ; i++)
- {
- monster[i] = datas[i];
- }
- for (int i = ; i < ; i++)
- {
- Console.WriteLine(monster[i]);
- }
- #endregion
- #region 多维度的索引号
- //索引号可以任意维度
- //用一个MyArray类去模拟一个二维数组
- MyArray myArray = new MyArray(, );
- for (int x = ; x < myArray.GetLength(); x++)
- {
- for (int y = ; y < myArray.GetLength(); y++)
- {
- myArray[x, y] = x * + y;
- }
- }
- for (int y = ; y < myArray.GetLength(); y++)
- {
- for (int x = ; x < myArray.GetLength(); x++)
- {
- Console.Write(myArray[x, y] + "\t");
- }
- Console.WriteLine();
- }
- #endregion
- #region 索引器-沈军
- // 属性 操作字段
- // 索引器 对于操作集合的一种封装
- //Unity1803 unity1803 = new Unity1803();
- //unity1803[2] = new Student("沈天宇", 20, 95);
- for (int i = ; i < Unity1803.Instance.Count; i++)
- {
- if (Unity1803.Instance[i])
- {
- Console.WriteLine(Unity1803.Instance[i]); // .ToString()方法
- }
- }
- Unity1803.Instance[Unity1803.Instance.Count] = "丁超"; // 隐式类型转换
- string name = (string)Unity1803.Instance[]; // 显式类型转换
- //Console.WriteLine(unity1803["沈天宇"]);
- //Unity1803 _unity1803 = new Unity1803();
- //Console.WriteLine(Unity1803.Count);
- //Unity1803.instance = new Unity1803(); // 只读的
- //Unity1803 u1 = new Unity1803(); // 不允许的
- //Console.WriteLine(Unity1803.Instance[0]);
- // 隐式转换 显式转换
- int num1 = ;
- byte num2 = ;
- num1 = num2; // 隐式类型转换
- num2 = (byte)num1; // 显式类型转换
- #endregion
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace m1w4d2_operator
- {
- #region 练习1
- //通过重载运算符,我们可以给自定类型,增加计算功能
- struct Point2D
- {
- public int x, y;
- public Point2D(int x, int y)
- {
- this.x = x;
- this.y = y;
- }
- public static Point2D Up = new Point2D(, -);
- public static Point2D Down = new Point2D(, );
- public static Point2D Left = new Point2D(-, );
- public static Point2D Right = new Point2D(, );
- //返回类型?,函数名(operator 运算符)?参数?
- //public static i = i + 1;
- //两个参数,任意类型
- //返回类型,任意类型
- //算数运算符 是双目运算符,参数必须是两个,任意类型,返回类型,任意类型
- public static Point2D operator +(Point2D a, Point2D b)
- {
- return new Point2D(a.x + b.x, a.y + b.y);
- }
- public static Point2D operator -(Point2D a, Point2D b)
- {
- return new Point2D(a.x - b.x, a.y - b.y);
- }
- //关系运算符 是双目运算符,参数必须是两个,任意类型,返回类型是bool
- public static bool operator ==(Point2D a, Point2D b)
- {
- return a.x == b.x && a.y == b.y;
- }
- public static bool operator !=(Point2D a, Point2D b)
- {
- return !(a == b);
- }
- public override string ToString()
- {
- return string.Format("[x:{0},y{1}]", x, y);
- }
- }
- #endregion
- #region 练习2
- class Item
- {
- public static string style = "剑刀盾斧药";
- public Item(string name, int value)
- {
- this.name = name;
- this.value = value;
- }
- string name;
- int value;
- public override string ToString()
- {
- return string.Format("{0}:value:{1}", name, value);
- }
- }
- class Monster
- {
- public static Random roll = new Random();
- public int attack;
- public string name;
- public int speed;
- public Monster(int attack, int speed, string name)
- {
- this.attack = attack;
- this.name = name;
- this.speed = speed;
- }
- public static Item operator +(Monster a, Monster b)
- {
- string name = a.name.Substring(a.name.Length / ) + b.name.Substring(b.name.Length / ) + Item.style[roll.Next(, Item.style.Length)];
- int value = (a.attack + b.attack) * + a.speed + b.speed;
- if (name[name.Length - ] == '屎')
- {
- value /= ;
- }
- return new Item(name, value);
- }
- public override string ToString()
- {
- return string.Format("{0}:attack:{1},speed:{2}", name, attack, speed);
- }
- }
- #endregion
- class Program
- {
- static void Main(string[] args)
- {
- #region 练习1
- //老位置
- Point2D oldPosition = new Point2D(, );
- //position.x += dir.x;
- //新位置 是老位置 向上走一步
- Console.WriteLine(oldPosition);
- Point2D newPosition = oldPosition + Point2D.Up;
- Console.WriteLine(newPosition);
- //请问,新位置在老位置的哪个方向
- string dirStr = "";
- Point2D pointDir = newPosition - oldPosition;
- if (pointDir == Point2D.Up) dirStr = "上";
- else if (pointDir == Point2D.Down) dirStr = "下";
- else if (pointDir == Point2D.Left) dirStr = "左";
- else if (pointDir == Point2D.Right) dirStr = "右";
- Console.WriteLine("你的前进方向是{0}", dirStr);
- #endregion
- #region 练习2
- Monster a = new Monster(, , "哥布林");
- Monster b = new Monster(, , "索尼克");
- Console.WriteLine(a);
- Console.WriteLine(b);
- Item item = a + b;
- Console.WriteLine(item);
- #endregion
- }
- }
- }
C#学习笔记(十六):索引器和重载运算符的更多相关文章
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- MySQL学习笔记十六:锁机制
1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...
- Struts2学习笔记(十)——自定义拦截器
Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理.Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的:Struts2拦截器栈就 ...
- Java基础学习笔记十六 集合框架(二)
List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...
- 文件的上传Commons FileUpload(web基础学习笔记十六)
一.表单设置 <form action="<%=request.getContextPath()%>/jsp/admin/doAdd.jsp" enctype=& ...
- JavaScript权威设计--CSS(简要学习笔记十六)
1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...
- SharpGL学习笔记(十六) 多重纹理映射
多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...
随机推荐
- BUG笔记:Android原生浏览器不认负百分数margin致Foundation Orbit往右滑动动画出错
一看这标题就知道无比蛋疼了是不?至少我从来不用安卓自带的浏览器... 发现这个bug的场景:万恶的Foundation,它的滚动图片插件Orbit在安卓自带浏览器下手指从左往右滑动时动画仍旧表现为从右 ...
- mysql 用户与权限
1.用户 1)创建用户 "create user '用户'@'host' identified by '密码';" 在5.7以后的版本中要求密码包含至少一个大写字母,一个小写字 ...
- 网络密钥交换协议——Diffie-Hellman
Diffie-Hellman算法是一种交换密钥的算法. 它是眼下比較经常使用的密钥交换算法. 这样的算法的优点是能让两台计算机在不安全的网络环境中完毕密钥的交换. 下面是整个算法的过程.当中红色字体表 ...
- OC convertRect
举个例子: redView = [[UIView alloc]initWithFrame:CGRectMake(50, 100, 100, 100)]; redView.backgroundColor ...
- 一起做RGB-D SLAM (2)
第二讲 从图像到点云 本讲中,我们将带领读者,编写一个将图像转换为点云的程序.该程序是后期处理地图的基础.最简单的点云地图即是把不同位置的点云进行拼接得到的. 当我们使用RGB-D相机时,会从相机里读 ...
- list的*运算使用过程中遇到的问题
目的: 想生成一个[[],[],[]] 这样的列表, 所以就 [[]]*3 这样做了,但是这样做会有问题,这样list中的三个list其实是同一个list. 例如:a=[[]]*3,然后a[0].ap ...
- SpringMyBatisDay02
全篇概述:IOC DI 参数值注入 注解依赖注入 1.Spring IOCIOC 全称Inversion Of Control,被翻译成控制反转控制反转指:程序中对象的获取方式 ...
- #C++初学记录(算法4)
A - Serval and Bus It is raining heavily. But this is the first day for Serval, who just became 3 ye ...
- VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)
上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...
- form表单提交 type="submit"
<form action="" method="post" onsubmit="return validte()"> < ...