如何创建静态数据结构?

alank2

成员
已加入
一月10,2019
留言内容
6
编程经验
10+
我的第一篇文章在这里。我正在学习来自C / C ++的C#。尝试去"port"我熟悉的一个从C到C#的项目(Enigma密码机模拟器)作为学习练习。目的不是要做一个简单的端口,而是要按照正确的C#模式从头开始编写的C#中实现它。

这是C语言中非常依赖定义的结构,基本上所有东西都定义为uint8_t。

我的第一步是用常量替换定义。

#define POSITIONS 26
成为:
上市 const int POSITIONS = 26;

我遇到的最大问题是如何在C#中创建静态数据结构。我用它来跟踪各种机器派生,在C语言中很容易做到:

C#:
struct MachineType
  {
    uint8_t Name[5],Mode,HasPlugboard,HasGapRotors,HasGearbox,EntryWheel,NoReflectors,ReflectorNames[4],Reflectors[4],NoRotors,RotorNames[8],Rotors[8];
  } Machines[] =
  {
    //MACH_A865
    {"A865", MODE_SU3R, 0, 0, 1, ROTOR_ETWQ, 1, "O",    {ROTOR_REFLO},
    3, "123",      {ROTOR_1A, ROTOR_2A, ROTOR_3A}},

    //MACH_D
    {"D",    MODE_SU3R, 0, 1, 0, ROTOR_ETWQ, 1, "O",    {ROTOR_REFLO},
    3, "123",      {ROTOR_1O, ROTOR_2O, ROTOR_3O}},
  };

所以我的问题是,您将如何在C#中实现这样的结构?我真的遇到了阵列多个问题的麻烦。我什至看到了一个页面,该页面显示了使用构造函数,然后使用多个新的调用来构建它,但这似乎很麻烦。我已经尝试过这样的事情:

C#:
//public struct testtype
        //{
        //    public int var1, var2;

        //    public testtype(int Avar1, int Avar2)
        //    {
        //        var1 = Avar1;
        //        var2 = Avar2;
        //    }
        //}

        //public testtype[] test2 =
        //    {
        //      new testtype(4,5),
        //      new testtype(6,7)
        //    };

另一个问题是,尽管听起来不错,但尝试做正确的事情并将其标记为const似乎是不可能的。搜索表明它不能被标记为const,因为它是引用类型?如果这是真的,那么所有引用类型都不能标记为const似乎很奇怪。

感谢您的所有想法和帮助!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我现在没有时间完全解决这个问题,但是就常量而言,只能使用文字值或其他常量来设置它们。由于引用类型通常没有文字表示形式,因此它们也不能是常量。明显的例外是String类。您可以具有文字字符串,因此也可以具有字符串常量。替代方法是声明为“只读”的字段。
 
已加入
一月10,2019
留言内容
6
编程经验
3-5
您可以尝试使用此代码来构建静态数据结构。

上市 静态的 班级 MyStaticClass
{
上市 静态的 整型 myStaticVariable = 0;

上市 静态的 空白 MyStaticMethod()
{
安慰.WriteLine("这是一种静态方法。");
}

上市 静态的 整型 MyStaticProperty { 得到; ; }
}

班级 程序
{
静态的 空白 Main(细绳[] args)
{

安慰.WriteLine(MyStaticClass.myStaticVariable);

MyStaticClass.MyStaticMethod();

MyStaticClass.MyStaticProperty = 100;

安慰.WriteLine(MyStaticClass.MyStaticProperty);
}
}
 

alank2

成员
已加入
一月10,2019
留言内容
6
编程经验
10+
对于MyStaticProperty-{get;的意义是什么?放; }

这仅仅是使其成为财产吗?
没有{放; }只是一个字段吗?
有什么区别?我不明白为什么给它一个get / set值不值钱,如果他们只是提供了完整的读写变量的权利...
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
您可以尝试使用此代码来构建静态数据结构。

上市 静态的 班级 MyStaticClass
{
上市 静态的 整型 myStaticVariable = 0;

上市 静态的 空白 MyStaticMethod()
{
安慰.WriteLine("这是一种静态方法。");
}

上市 静态的 整型 MyStaticProperty { 得到; ; }
}

班级 程序
{
静态的 空白 Main(细绳[] args)
{

安慰.WriteLine(MyStaticClass.myStaticVariable);

MyStaticClass.MyStaticMethod();

MyStaticClass.MyStaticProperty = 100;

安慰.WriteLine(MyStaticClass.MyStaticProperty);
}
}

当OP说"static"从C#中的“静态”关键字的意义上讲,它们的意思不是,即类的成员而不是类的实例的成员,而是具有不变的值。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
对于MyStaticProperty-{get;的意义是什么?放; }

这仅仅是使其成为财产吗?
没有{放; }只是一个字段吗?
有什么区别?我不明白为什么给它一个get / set值不值钱,如果他们只是提供了完整的读写变量的权利...

是的,getter和setter方法使成员成为属性而不是字段。公共成员应该几乎总是属性而不是字段,但是主要的例外是当数据无法更改时。您会发现,整个.NET Framework中的许多类型都有公共常量,或更一般地说,是只读字段。就像我之前说过的,如果您要为无法声明为常量的类型提供类似常量的行为,请使用只读字段。两者之间有一些区别,我认为一个是C#意义上的常量实际上是静态的,即,常量是类型的成员,而不是类型的实例的成员,而字段是实例成员,除非您明确声明它们'静态的'。
 

alank2

成员
已加入
一月10,2019
留言内容
6
编程经验
10+
When the OP says "static"从C#中的“静态”关键字的意义上讲,它们的意思不是,即类的成员而不是类的实例的成员,而是具有不变的值。

是的,对此感到抱歉。我确实知道static对成员/字段意味着什么。
 
最佳 底部