小编hai*_*yyu的帖子

可变结构与类?

我不确定是使用可变结构还是可变类.我的程序存储了一个包含大量对象的数组.我注意到使用类会使所需的内存量翻倍.但是,我希望这些对象是可变的,并且我被告知使用可变结构是邪恶的.这就是我的类型:

struct /* or class */ Block
{
    public byte ID;
    public bool HasMetaData; // not sure whether HasMetaData == false or
                             // MetaData == null is faster, might remove this
    public BlockMetaData MetaData; // BlockMetaData is always a class reference
}
Run Code Online (Sandbox Code Playgroud)

像这样分配大量的对象(注意下面的两个代码都运行了81次):

// struct
Block[,,] blocks = new Block[16, 256, 16];
Run Code Online (Sandbox Code Playgroud)

使用大约35 MiB的内存,同时这样做:

// class
Block[,,] blocks = new Block[16, 256, 16];
for (int z = 0; z < 16; z++)
for (int y = 0; y < 256; …
Run Code Online (Sandbox Code Playgroud)

c# memory struct class mutable

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

定义委托的两种方法

可能重复:
非常简单的代表沉思

我一直在想这种定义委托的方法有什么区别

System.Action act;
act = MethodWithoutParameters;
Run Code Online (Sandbox Code Playgroud)

还有这个

System.Action act;
act = new System.Action(MethodWithoutParameters);
Run Code Online (Sandbox Code Playgroud)

.我应该更喜欢一个吗?如果是这样,为什么?遗憾的是,我无法找到有关我的问题的更多信息.如果有人能告诉我这两段代码之间的差异,我真的很感激.

.net c# delegates definition

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

数据写入流时的事件?

我正在尝试创建一个程序,一旦将新数据写入FileStream对象,就会调用一个动作.我目前的做法如下:

public class BlockingFileStream : FileStream
{

    public override int Read(byte[] array, int offset, int count)
    {
        while (Position == Length) ;
        return base.Read(array, offset, count);
    }

    public override int ReadByte()
    {
        while (Position == Length) ;
        return base.ReadByte();
    }

}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,所有这一类都要等到流的长度大于其当前位置.它似乎工作,但是,我一直想知道是否有更好的方法来做到这一点.所以我的问题是:

有没有更好的方法来执行上面发布的代码剪辑中所执行的操作?

c# events filestream

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

仅在变量类型为派生类时才有效?

我有以下代码:

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
        object objTest = test;

        Console.WriteLine(test.GetType());    // Output: "OperatorOverload.Test"
        Console.WriteLine(objTest.GetType()); // Output: "OperatorOverload.Test"

        Console.WriteLine(test == null);    // Output: "True"
        Console.WriteLine(objTest == null); // Output: "False"

        test.Equals(null);    // Output: "Hi!"
        objTest.Equals(null); // Output: "Hi!"

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试看起来像这样:

class Test
{

    public static bool operator ==(Test obj1, Test obj2)
    {
        return true;
    }

    public static bool operator !=(Test obj1, Test obj2)
    {
        return !(obj1 == obj2);
    }

    public …
Run Code Online (Sandbox Code Playgroud)

c# inheritance operator-overloading

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