2

我在服务器端有一个结构,布局如下:

struct SomeStruct
{
    public string SomeString { get; set; };
    public string SomeString1;
    public string SomeString2;
    public string SomeString3;
}

我正在使用客户端/服务器模型,并且该结构的一个实例被引用了很多次,因为它具有非常重要的信息(超过 200 次)。

问题是当某个函数被调用时,这个结构中的值变为空。我不知道为什么,它一直困扰着我很长时间。

在意识到这个值为空之前,我调用了很多方法,所以我不知道我的代码的哪一部分使我的字符串无效。

我正在使用 VS2012,但我也有 2010 和 2008 终极版。我想知道当某些代码部分使我的字符串无效时是否有一种方法可以执行触发器。

我尝试添加一些这样的属性,但从未抛出异常:

struct SomeStruct {
    string somestr;
    public string SomeString
    {
        get { return somestr; }
        set
        {
            if (value == null)
            {
                throw new Exception("stirng is null");
            }

            somestr = value;
        }
    }
    public string SomeString1;
    public string SomeString2;
    public string SomeString3;
}

可能不重要,但这是我正在使用的结构之一(Name 变量在我的代码的某些部分变为 null,其余变为 default()):

[ProtoContract]
public struct CharacterInformation
{
    [ProtoMember(2)]
    public string Name;
    [ProtoMember(3)]
    public IntegerVector2 Position;
    [ProtoMember(5)]
    public CharacterDirection Direction;
    [ProtoMember(6)]
    public CharacterStatus Status;
    [ProtoMember(7)]
    public CharacterClass Class;
    [ProtoMember(8)]
    public CharacterRace Race;
    [ProtoMember(9)]
    public CharacterType Type;
    [ProtoMember(10)]
    public CharacterFaction Faction;
    [ProtoMember(11)]
    public float MovementModifier;
    [ProtoMember(12)]
    public CharacterEquipment Equipment;
}

编辑:此结构的唯一实例是在与 Sql 相关的函数上创建的:

public CharacterServerInformation GetInformation(int charID)
        {
            CharacterServerInformation information = new CharacterServerInformation();
            if (!authInstance.CharacterExists(charID))
            {
                // char doesn't exists
                throw new Exception("Character doesn't exists");
            }
            information.ID = charID;
            information.Experience = GetExperience(charID);
            information.Info.Direction = CharacterDirection.Bottom;
            information.Info.Name = authInstance.CharacterGetName(charID);
            information.Info.Class = GetClass(charID);
            information.Info.Faction = GetFaction(charID);
            information.Info.Position = GetPosition(charID);
            information.Info.Race = GetRace(charID);
            information.Info.Status = GetStatus(charID);
            information.Info.Type = GetType(charID);
            information.Info.MovementModifier = 1f; // should store old movement modifier, but well, whatever
            information.HealthLeft = GetHealthLastLogout(charID);
            return information;
        }
4

1 回答 1

4

我怀疑问题纯粹是因为您正在使用struct而不是制作class. 由于struct成员按值复制到方法中,并且当从方法(包括属性获取器)返回时,您很可能会因在struct某处意外写入新内容而“丢失”信息。

在这种情况下,class似乎更合适。如果您阅读Choosing Between Classes and Structures,您会发现struct仅应在以下情况下使用它:

  • 它在逻辑上表示单个值,类似于原始类型(整数、双精度等)。
  • 它的实例大小小于 16 字节。
  • 它是不可变的。
  • 它不必经常装箱。

在你的情况下,所有这些标准(可能除了最后一个)都被违反了,所以class会更合适。

于 2012-10-05T23:33:56.023 回答