首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#if C#中的PreProcessor

#if C#中的PreProcessor
EN

Stack Overflow用户
提问于 2010-12-09 00:46:44
回答 5查看 1K关注 0票数 0

我是C#/Asp.net World的新手,最近我遇到了#if DEBUG PreProcessor,但即使看了Stack Over flow和MSDN网站和其他博客上的帖子,我也不能让它工作。

我正在做一个小网站。我通过在解决方案中添加一个新项目来实现DataLayer。在数据层中,我正在检查传递给存储过程的参数。

因此,目的是打印应用程序在调试模式下运行时传递的参数,以及当应用程序在发布模式下运行时不应显示这些参数。

任何帮助都将不胜感激。

谢谢

代码语言:javascript
复制
#define DEBUG

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TestWebsite.DataLayer.BussinessObjects;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using System.Data.Common;

namespace TestWebsite.DataLayer  
{  
    public class StatesManager  
    {   
        public ICollection<States> getAll(States statesObj)  
        {  
            List<object> parameters = new List<object>();  
            List<States> scol = new List<States>();  
            try  
            {  
                parameters.Add(statesObj.State);
                parameters.Add(statesObj.Abbreviation);
                parameters.Add(statesObj.StartRowIndex);
                parameters.Add(statesObj.MaximumRowsCount);
                parameters.Add(statesObj.SortExpression);
                parameters.Add(statesObj.SortDirection);

#if DEBUG
                System.Web.HttpContext.Current.Response.Write("State =" + statesObj.State + ",<br/>");
                System.Web.HttpContext.Current.Response.Write("Abbreviation =" + statesObj.Abbreviation + ",<br/>");
                System.Web.HttpContext.Current.Response.Write("StartRowIndex =" + statesObj.StartRowIndex.ToString() + ",<br/>");
                System.Web.HttpContext.Current.Response.Write("MaximumRowsCount =" + statesObj.MaximumRowsCount.ToString() + ",<br/>");
                System.Web.HttpContext.Current.Response.Write("SortExpression =" + statesObj.SortExpression + ",<br/>");
                System.Web.HttpContext.Current.Response.Write("SortDirection =" + statesObj.SortDirection.ToString() + "<br/>");
#endif

                object[] paramArray = parameters.ToArray();

                SqlDatabase db = new SqlDatabase(ConnectionManager.ConnectionString);
                DbCommand dbCommand = db.GetStoredProcCommand("GetAllStates", paramArray);
                IDataReader reader = db.ExecuteReader(dbCommand);

                while (reader.Read())
                {
                    States sreader = new States();
                    sreader.State = (string)reader[reader.GetOrdinal("State")];
                    sreader.Abbreviation = (string)reader[reader.GetOrdinal("Abbreviation")];
                    sreader.IsActive = (bool)reader[reader.GetOrdinal("IsActive")];
                    sreader.RowNumber = (long)reader[reader.GetOrdinal("RowNo")];
                    sreader.StateID = (int)reader[reader.GetOrdinal("StateID")];

                    scol.Add(sreader);
                    sreader = null;
                }
                reader.Dispose();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally { parameters = null; }
            return scol;
        }  
    }  
} 
EN

回答 5

Stack Overflow用户

发布于 2010-12-09 00:51:41

您可能正在尝试在ASPX页面中使用#if

预处理器仅在C#源代码中受支持。

相反,您可以使用普通的if

代码语言:javascript
复制
<% if (HttpContext.Current.IsDebuggingEnabled) { %>
    ...
<% } %>

此属性反映Web.config中是否存在<compilation debug="true">

你也许能写出

代码语言:javascript
复制
<%
#if DEBUG %>
   ...
<%
#endif%>

(注意换行符),但我认为它不会起作用。

票数 3
EN

Stack Overflow用户

发布于 2010-12-09 00:50:59

在解决方案资源管理器中右击项目,再单击“属性”。转到Build选项卡,然后从下拉菜单中选择Debug configuration。确保选中了“定义调试常量”。

对Release配置执行相同的操作,但确保未选中“定义调试常量”。

这将确保所有

代码语言:javascript
复制
#if DEBUG

指令的工作方式与您预期的一样。

编辑:由于您使用的是网站项目,请进入web.config文件,在system.web部分下找到或添加一个节点。此属性将打开和关闭调试常量。

票数 0
EN

Stack Overflow用户

发布于 2010-12-09 00:54:33

不能在ASP.NET标记中使用#if。如果使用代码隐藏,则可以在标记中执行以下操作:

代码语言:javascript
复制
<asp:PlaceHolder runat="server" ID="DebugOutput" EnableViewstate="false" Visible="false">
    <asp:Literal runat="server" ID="OutputValue" />
</asp:PlaceHolder>

在你的代码中:

代码语言:javascript
复制
#if DEBUG
    DebugOutput.Visible = true;
    OutputValue.Text = "My output string";
#endif

您可以使用面板而不是占位符,但是即使在禁用viewstate的情况下,面板也具有控件状态,因此即使在发布代码中,也会在viewstate中获得该面板的条目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4389979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档