Mit ‘C#’ getaggte Artikel

Debugger anfordern

Samstag, 26. September 2009

Hin und wieder gibt es den Bedarf den Ablauf eines Programmes zu stoppen und in den Debugger zu springen. Visual Studio bietet hier die komfortable Möglichkeit der Haltepunkte (neudeutsch Breakpoints). Leider gibt es öfter Situationen, an denen ein einfacher Breakpoint nicht ausreicht. Dies ist insbesondere der Fall wenn die jeweilige Zeile 100fach ausgeführt wird, aber man nur bei einer bestimmten Nebenbedingung den Debugger auslösen möchte.

System.Diagnostics.Debugger.Break()

Diese Funktionalität nutze ich beim FBK. Wenn ich die Ausführung einer bestimmten Rolle testen möchte, trage ich in der Xml-Konfigurationsdatei das Attribut ‘debug’ ein.

        <role type="mutateresources" id="BeerMutating" debug="True">
          <input>
            <resource type="Hop" amount="8" />
            <resource type="Brewer" amount="8" />
          </input>
          <output>
            <resource type="Beer" amount="8" />
          </output>
          <outputresearcheffects>
            <researcheffect research="Brewery">
              <multiplicator type="exponential"
                             factor="1"
                             base="1.1"
                             exponentoffset="0"
                             offset="0" />
            </researcheffect>
          </outputresearcheffects>
        </role>

Wird diese Rolle nun ausgeführt, so hält Visual Studio die Ausführung an und ermöglicht ein einfaches Debuggen.

/// <summary>
/// Executes the role
/// </summary>
/// <param name="worldState">Current worldstate</param>
public void Execute(IWorldState worldState)
{
    if (this.Role.IsDebug)
    {
        Debugger.Break();
    }

    this.Role.ExecuteRole(this.RoleStatus, worldState);
}

Nettes Feature…

Manchmal darf es eben LINQ sein

Samstag, 22. August 2009

/// <summary>
/// Gets the dashboarditems of the player
/// </summary>
/// <param name="amount">Number of items to be returned</param>
/// <returns>Enumeration of Dashboarditems</returns>
public IEnumerable<DashboardItem> GetDashboardItems(int amount)
{
    var messageSystem = this.LogicSession.GetLogicHandler<IMessageSystemLogic>();
    var playerActionLogic = this.LogicSession.GetLogicHandler<IPlayerActionLogic>();
    var languageHandler = this.LogicSession.GetLogicHandler<ILanguageHandler>();

    return from y in
               ((from x in messageSystem.GetMessages(this.playerLogic.PlayerId)
                 orderby x.Created
                 select x).Take(amount))
           let z = playerActionLogic.GetPlayer(y.SenderId)
           let playername = z == null ?
                    languageHandler["/web/messagespage/system"] :
                    z.GetData().Playername
           select new DashboardItem(
               playername,
               y.Subject +
                (!string.IsNullOrEmpty (y.Content) ?  " – " + y.Content : string.Empty),
               DashboardItem.DefaultType.Message,
               DateTime.Now);
}

Hin und wieder muss man einfach mal unkonventionell programmieren. Nicht das schönste Query, aber es funktioniert.