2

サーバー側に次のようなレイアウトの構造体があります。

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

私はクライアント/サーバーモデルを使用していますが、この構造体のインスタンスは非常に重要な情報(200回以上)を持っているため、何度も参照されます。

問題は、いくつかの関数が呼び出されると、この構造体内の値がnullになるということです。理由はわかりませんが、長い間私を悩ませてきました。

この値がnullであることに気付く前に多くのメソッドを呼び出すので、コードのどのセクションが文字列をnull化するのかわかりません。

私はVS2012を使用していますが、2010年と2008年のUltimateも使用しています。コードの一部が文字列を無効にしたときにトリガーを実行する方法があるかどうか疑問に思いました。

私はこのようないくつかのプロパティを追加しようとしましたが、例外はスローされませんでした:

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;
}

重要ではないかもしれませんが、これは私が使用している構造体の1つです(コードの一部で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はるかに適切なようです。クラスと構造の選択を読むと、次のstruct場合にのみ使用する必要があることがわかります。

  • プリミティブ型(integer、doubleなど)と同様に、単一の値を論理的に表します。
  • インスタンスサイズが16バイト未満です。
  • 不変です。
  • 頻繁に箱詰めする必要はありません。

あなたの場合、これらの基準のすべて(おそらく最後のものを除く)が違反されているので、classより適切でしょう。

于 2012-10-05T23:33:56.023 に答える