我发现一个反复出现的不便是.Net框架中的许多简单类型都没有标记为可序列化.例如:System.Drawing.Point或Rectangle.
这些结构只包含原始数据,并且应该可以容易地以任何格式进行序列化.但是,由于缺少[ System.Serializable]属性,我无法使用它们BinaryFormatter.
这有什么理由,我没有看到?
我有一个结构的通用字典作为键,一个类引用作为值.
Dictionary<IntVector2, SpriteRenderer> tileRendererMap;
Run Code Online (Sandbox Code Playgroud)
我通过坐标检索对渲染器的引用,并将其更改为:
tileRendererMap[tileCoord].color = Color.cyan;
Run Code Online (Sandbox Code Playgroud)
每次使用它时都会产生0.8KB的垃圾.这是默认行为吗?我认为字典查找将是最有效的事情之一.我需要找到解决方法,因为我正在为移动平台工作,这是一个关键系统.
任何想法我可能做错了或如何获得免配置查找?
更多测试后编辑:
使用int作为键而不是我的自定义结构按预期工作.没有分配,没有问题,我认为使用id作为密钥并不奇怪.但是,对于我的游戏,我想将与特定图块相关联的渲染器存储在网格中,实际上不需要是任何类型的对象,因为我只关心网格位置.因此,我认为IntVector2可能是一个实用的标识符,但如果必须,我可以解决它.
使用我的结构时,我得到了分配,我用Unity3D Profiler测量.它在Dictionary_get_item中报告0.8KB ,特别是DefaultComparer.Equals().显然它是一个装箱/拆箱问题,但即使我实现自定义覆盖,它仍然会产生垃圾,只比以前少一点.
我的基本结构实现:
public struct IntVector2
{
public int x, y;
public override bool Equals(object obj)
{
if (obj == null || obj is IntVector2 == false)
return false;
var data = (IntVector2)obj;
return x == data.x && y == data.y;
}
public override int GetHashCode()
{
return x.GetHashCode() ^ y.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
接受答案后编辑:
在通用词典中使用时,我的结构的免分配版本.
public struct IntVector2 : IEquatable<IntVector2>
{ …Run Code Online (Sandbox Code Playgroud) 我在外部类中有一个嵌套类,在内部类中有一个嵌套类,我想在运行时通过反射获取外部类的名称。
public abstract class OuterClass // will be extended by children
{
protected class InnerClass // will also be extended
{
public virtual void InnerMethod()
{
string nameOfOuterClassChildType = ?;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这在c#中可能吗?
编辑:我应该补充一点,我想使用反射并从从 OuterClass 扩展的子类中获取名称,这就是原因,我在编译时不知道具体类型。
我有几百个类,它们还不属于任何名称空间。我想选择它们并将它们全部放入一个新的命名空间中。在 Visual Studio 中或在 Resharper 等工具的帮助下是否有任何半自动化的方法来执行此操作?
它必须以一种允许我选择要放入命名空间的文件的方式工作,因为并非所有文件都应该更改。最好的方法是只选择项目中我需要的文件,然后点击一些宏操作将命名空间声明添加到所选文件中。
目前,我已经开始单独打开文件,选择类定义并按 CTRL+K+S 以包围命名空间,但这可能需要几天的时间。
我正在研究这种iso网格游戏(更精确:二维投影,以典型的钻石布局编制索引),并希望实现圆形画笔在地图上绘制瓷砖,就像在任何图像编辑软件中一样.我从中点圆算法开始,但立即注意到,结果看起来不像我想要的1到7之间的小画笔大小.
我宁愿有这样的事情:
忽略,第一个圆圈没有填充,当然这很容易.在iso网格上是否有适合的形状生成算法?我可能甚至不想要圆形,而是交替四边形和十字形/ x形.
以下是从维基百科中获取的第一个图像样本的代码:
static List<IntVector2> GetBrushCircleCoords(int x0, int y0, int radius)
{
List<IntVector2> coords = new List<IntVector2>();
int x = radius;
int y = 0;
int err = 0;
while (x >= y)
{
coords.Add(new IntVector2(x0 + x, y0 + y));
coords.Add(new IntVector2(x0 + y, y0 + x));
coords.Add(new IntVector2(x0 - y, y0 + x));
coords.Add(new IntVector2(x0 - x, y0 + y));
coords.Add(new IntVector2(x0 - x, y0 - y));
coords.Add(new IntVector2(x0 - y, y0 - x)); …Run Code Online (Sandbox Code Playgroud) 我有多种测试方法,应该测试多个参数的所有可能组合.我可以在这样的方法上使用NUnit ValueAttribute或RangeAttribute:
[TestFixture]
public class MyExampleTests
{
[Test]
public void TestedEntity_GivenParemeter_Passes(
[Values(1, 2)] int inputA,
[Range(1, 4)] int inputB)
{
if (inputA > 0 && inputB > 0)
Assert.Pass();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的实际案例中,有4个参数,十几个方法和更多的值,因此写出每个方法的所有值变得冗长乏味,如果我想进行更改,我可能会在某处犯错.
如何将所有值组合的测试生成从各个方法移到TestFixture体中?以下不起作用,但它将是我想要的:
[TestFixture]
public class MyExampleTests2
{
readonly int inputA;
readonly int inputB;
public MyExampleTests2(
[Values(1, 2)] int inputA,
[Range(1, 4)] int inputB)
{
this.inputA = inputA;
this.inputB = inputB;
}
[Test]
public void TestedEntity_GivenParemeter_Passes()
{
if (this.inputA > 0 && this.inputB > …Run Code Online (Sandbox Code Playgroud) c# ×6
.net-2.0 ×1
algorithm ×1
automation ×1
dictionary ×1
isometric ×1
namespaces ×1
nunit ×1
nunit-2.6 ×1
resharper ×1