【问题标题】:C# Assign/cast to object fields in a structC# 分配/强制转换到结构中的对象字段
【发布时间】:2011-09-29 16:42:34
【问题描述】:

对于这个新手问题,我很抱歉,我对 C# 非常陌生,它是语义。我有以下结构:

public struct MT5Command{

    public MT5CommandType Type{ get;  set;}

    public AutoResetEvent ThreadWaitHandle { get; set; }

    public object InParam { get; set; }

    public object OutParam { get; set; }

}

还有这段代码sn-p:

MT5Command Cmd = new MT5Command();
Cmd.Type = MT5CommandType.GetServerInformation;
Cmd.ThreadWaitHandle = waitHandle.Value;
attributes = new ServerAttributes();
Cmd.OutParam = attributes;
....
ServerAttributes SrvAttributes = new ServerAttributes();
Cmd.OutParam = (ServerAttributes)SrvAttributes;

最后一行无法编译:无法修改“command”的成员,因为它是“foreach 迭代变量” 如何将 OutParam 字段分配给另一个 ServerAttributes 结构?

这是外部 for-each 循环:

foreach (MT5Command Cmd in mCommandQueue.GetConsumingEnumerable())
{
   ...
}

谢谢,于尔根

【问题讨论】:

  • 您需要在代码 sn-p 中包含您的 foreach 循环。但基本上,你正在做类似foreach (MT5Command foo in bar) { foo.OutParam = ... } 的事情。您可以改为使用 for 循环并直接访问您的集合元素,例如。 bar[i].

标签: c# casting struct field


【解决方案1】:

在这种情况下,你不能。你还没有给出完整的 sn-p,但我怀疑它是这样的:

foreach (MT5Command command in someCollection)
{
    // Code as posted
}

现在因为MT5Command 是一个结构,您将获得someCollection 中任何值的副本。无论如何,改变财产几乎肯定不会做你想做的事。编译器通过将command 变量设置为只读来保护您免受自己的伤害。你可以这样做:

MT5Command copy = command;
copy.OutParam = SrvAttributes;

...但我强烈怀疑这不是你想要的。

作为一项规则,拥有像您想出的那样的可变结构是一个非常糟糕的主意 - 而且听起来不应该首先是一个结构。

更多信息:

【讨论】:

  • 我只想给一个结构赋值。在 C++ 中,我会使用指向该结构的指针来完成。 C# 中的等价物是什么?我必须使用不安全的代码吗?
  • @Juergen:不,您必须了解 C# 和 C++ 非常不同。您可能只是想在这里上一堂课 - 但将 C# 作为与 C++ 不同的语言学习是真的重要的。您不能只是尝试将 C++ 习语应用于 C#;你最终会得到非常糟糕的代码。
  • 我已将 MT5Command 变量作为 ref 参数传递给队列。所以我认为这些结构是通过引用传递的,我以后可以使用它们。那么,如果我只是将所有结构都作为类,那么所有问题都没有了吗?
  • @Juergen:您可能还需要阅读我关于参数传递的文章:pobox.com/~skeet/csharp/parameters.html 如果您创建了结构类,那么您的眼前问题可能会消失,但仍然存在“打击和希望”编码。您应该了解您正在使用的语言,而不是根据另一种语言猜测它的语义。真正理解引用类型和值类型之间的区别是多么重要,我怎么强调都不为过。
  • 你说得对,我只是认为结构就是结构 ;-) 谢谢乔恩
猜你喜欢
  • 1970-01-01
  • 2011-02-02
  • 2018-05-12
  • 2011-01-02
  • 2021-06-12
  • 2017-08-21
  • 2016-03-20
  • 1970-01-01
  • 2021-03-10
相关资源
最近更新 更多