小编Xar*_*ugh的帖子

为什么.Net框架中的这么多简单类型没有标记为可序列化?

我发现一个反复出现的不便是.Net框架中的许多简单类型都没有标记为可序列化.例如:System.Drawing.PointRectangle.

这些结构只包含原始数据,并且应该可以容易地以任何格式进行序列化.但是,由于缺少[ System.Serializable]属性,我无法使用它们BinaryFormatter.

这有什么理由,我没有看到?

c# serialization

12
推荐指数
1
解决办法
348
查看次数

当使用struct作为通用字典键时,为什么C#会生成垃圾?

我有一个结构的通用字典作为键,一个类引用作为值.

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)

c# dictionary garbage-collection

6
推荐指数
1
解决办法
2836
查看次数

从嵌套类中获取周围类的名称

我在外部类中有一个嵌套类,在内部类中有一个嵌套类,我想在运行时通过反射获取外部类的名称。

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 扩展的子类中获取名称,这就是原因,我在编译时不知道具体类型。

c# .net-2.0

5
推荐指数
1
解决办法
977
查看次数

如何将大量文件选择放入 Visual Studio 中的命名空间中?

我有几百个类,它们还不属于任何名称空间。我想选择它们并将它们全部放入一个新的命名空间中。在 Visual Studio 中或在 Resharper 等工具的帮助下是否有任何半自动化的方法来执行此操作?

它必须以一种允许我选择要放入命名空间的文件的方式工作,因为并非所有文件都应该更改。最好的方法是只选择项目中我需要的文件,然后点击一些宏操作将命名空间声明添加到所选文件中。

目前,我已经开始单独打开文件,选择类定义并按 CTRL+K+S 以包围命名空间,但这可能需要几天的时间。

c# resharper automation namespaces visual-studio

5
推荐指数
1
解决办法
4437
查看次数

比中点圆更好的算法用于iso网格上的瓦片地图画笔

我正在研究这种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)

c# algorithm isometric

3
推荐指数
1
解决办法
665
查看次数

在NUnit TestFixture构造函数中使用Values-和Range-Attribute

我有多种测试方法,应该测试多个参数的所有可能组合.我可以在这样的方法上使用NUnit ValueAttributeRangeAttribute:

[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# nunit parameterized-unit-test nunit-2.6

2
推荐指数
1
解决办法
1597
查看次数