サーバー側に次のようなレイアウトの構造体があります。
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;
}