首页 文章 精选 留言 我的

精选列表

搜索[c 17],共10000篇文章
优秀的个人博客,低调大师

Unity C#编程优化——枚举

考虑下面关于行星枚举的这个例子:public enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO // Pluto is a planet!!!}起初,这样的定义还算好,直到需要产生一个行星的质量。所以我们做这样的事情:// Returns the mass of the planet in 10^24 kgpublic float GetMass(Planet planet) { switch(planet) { case Planet.MERCURY: return 0.330; case Planet.VENUS: return 4.87f; case Planet.EARTH: return 5.97f; ... case Planet.PLUTO: return 0.0146f; }} 行星直径又如何? 另一个switch语句? 密度怎么样? 重力? 逃跑速度? 只要想想你将要维护的switch语句的数量。 你可以争辩说,你可以使用一个Dictionary,但仍然笨重。 每个数据的Dictionary都要映射?没门。有一个更好的方法,我会告诉你如何。 这可能已经是非Unity程序员的常识,但我想在我的博客中再次提出这个冗余的主题,对于那些可能不知道这一点的人来说,特别是初学者。 我也想保持简单。基本上,你可以使用类作为枚举。 为什么用类? 这确实表现的更好 您可以存储任意数量的任意数据。 您甚至可以存储例程或功能。 你可以做很多事情。 唯一的要求是它是不可变的,这意味着类一个实例的状态在整个程序期间都不能改变。以下是Planet枚举用类表示的一个版本:public class Planet { // The different values public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f); public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f); public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f); public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f); public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f); public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f); public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f); public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f); public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f); // Use readonly to maintain immutability private readonly int id; private readonly float mass; // in 10^24 kg private readonly int diameter; // in km private readonly int density; // in kg/m^3 private readonly float gravity; // in m/s^2 // We use a private constructor because this should not be instantiated // anywhere else. private Planet(int id, float mass, int diameter, int density, float gravity) { this.id = id; this.mass = mass; this.diameter = diameter; this.density = density; this.gravity = gravity; } public int Id { get { return id; } } public float Mass { get { return mass; } } public int Diameter { get { return diameter; } } public int Density { get { return density; } } public float Gravity { get { return gravity; } } }为了保持不变性,所有成员变量应该是只读的。 一旦他们被分配,他们将不能再被改变。 这很重要,因为作为枚举,它的内部值不应该改变。 然后将每个枚举值实现为该类的静态只读实例。这是怎么用的? 与正常枚举是一样的,如下使用:// Use it like an enumship.TargetPlanet = Planet.NEPTUNE;// Want to know the target planet's mass?float mass = ship.TargetPlanet.Mass;// Density?int density = ship.TargetPlanet.Density;我们已经消除了切换语句或字典来维护不同行星信息的需要。 想要一个新的行星状态? 只需添加一个新的成员变量并在实例化上指定它们。如何从其他数据类型转换? 喜欢说从int id转换为Planet实例? 这很容易 通常我为这些转换添加了一个公共和静态方法。 例如:public class Planet { // The different values public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f); public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f); public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f); public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f); public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f); public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f); public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f); public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f); public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f); // This can be used to loop through all planets public static Planet[] ALL = new Planet[] { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO }; // Converts the specified id to a Planet instance public static Planet Convert(int id) { for(int i = 0; i < ALL.Length; ++i) { if(ALL.Id == id) { return ALL; } } // return ALL[id] could also work here but what if a non sequential id is used? throw new Exception("Cannot convert {0} to a Planet.".FormatWith(id)); } ...}// UsagePlanet planet = Planet.Convert(someIntPlanet);想从字符串ID转换? 添加将保存此值的字符串成员变量。 而不是使用诸如ALL []的数组,您可以使用如下所示的Dictionary:private static Dictionary<string, planet="" style="color: rgb(34, 34, 34); font-family: 微软雅黑; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">ALL = new Dictionary<string, planet="">() { { MERCURY.TextId, MERCURY }, { VENUS.TextId, VENUS }, { EARTH.TextId, EARTH }, ... { PLUTO.TextId, PLUTO },};// Converts the specified string to a Planet instancepublic static Planet Convert(string id) { return ALL[id];}您可以支持您喜欢的任何类型的转换。还有更多的你可以做。 您现在可以添加功能。 你可以这样做:Planet currentPlanet = Planet.VENUS;currentPlanet.ApplyGravity(ship);The coolest thing for me is you can specify different actions or behavior to the enum values. Something like this (It’s very contrived but you get the idea.):public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f, delegate(Ship ship) { // Actions on land of ship ship.AddFood(1000); ship.RetireCrew(); ship.RecruitNewCrew();});public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f, delegate(Ship ship) { // Actions on land of ship ship.DeductFood(50); ship.Research(); ship.Mine();});通过简单地将你的枚举变成一个类,你已经将它升级到更有组织的东西,而且更加功能强大。 您也可以使用反射和继承等先进功能,但大多数情况下,您不需要。 更多unity2018的功能介绍请到paws3d学习中心查找。

优秀的个人博客,低调大师

leetcode 28 c++ 实现strstr

暴力破解 从前往后找,结果超时了。。。。。。。。。。。。 int strStr(string haystack, string needle) { if (needle.length() == 0) return 0; if (needle.length() > haystack.length()) return -1; int n_index = 0; for (int i = 0; i < haystack.length(); i++) { if (n_index == needle.length()) { return i - needle.length(); } if (haystack[i] == needle[n_index]) { n_index++; } else { if (n_index > 0) { n_index = 0; n_index = 0; //从上一段重合的第二个字符开始找,不然第一段和第二段重合的会让你丢失第一段中后面的元素 i = i - needle.length() + 1; } } } if (n_index < needle.length()) return -1; else if (n_index == needle.length()) return haystack.length() - needle.length(); } 目测输在了每次我比较失败之后都会让 i 回到开始相同的点的后一个位置。来一个复杂度为O(n)的解法。 1、每次比较之前,判断余下的串的长度是否超过子串余下的串的长度 2、两个同步比较,使用continue跳出循环,降低时间复杂度 class Solution { public: int strStr(string haystack, string needle) { if(needle.size()==0) return 0; for(int i=0;i<haystack.size();i++){ if(i+needle.size()-1>=haystack.size()) return -1; int flag=1; for(int j=0;j<needle.size();j++){ if (haystack[i+j]==needle[j]) continue; flag=0; } if (flag==1) return i; } return -1; } };

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册